从 std::vector 继承的这个类声明有啥问题吗?
Posted
技术标签:
【中文标题】从 std::vector 继承的这个类声明有啥问题吗?【英文标题】:Is there something wrong with this class declaration inheriting from std::vector?从 std::vector 继承的这个类声明有什么问题吗? 【发布时间】:2012-05-08 10:11:11 【问题描述】:我意识到那里有更好的编译器,但我更喜欢坚持使用 vc6,每隔一段时间,我就会发现奇怪的侥幸,想知道这个编译器是针对我的安装本地化的还是每个人的本地化的。
请记住,有问题的编译器是:Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8168 for 80x86 (链接器等不相关,因为这个问题似乎不涉及它们)
尝试声明一个继承自 std::vector 的类,效果很好,除非您还尝试具体定义第二个模板参数:
10: class foo : public std::vector<LPTSTR,std::allocator<LPTSTR>>
11:
12: public:
13: foo();
14: ~foo();
15: ;
不编译并给出此错误: c:\foo\foo.h(10) : 错误 C2143: 语法错误: 在 '' 之前缺少 '>'
现在,真正的问题是,为什么这是合法的:
10: class foo : public std::vector<LPTSTR,std::allocator<LPTSTR>>>
11:
12: public:
13: foo();
14: ~foo();
15: ;
注意第 10 行末尾的额外 >
... 我想知道的是:
-
我是不是做错了什么?
这仅发生在我的安装中吗?
我是否应该避免使用该解决方法,因为它可能会在以后以某种方式导致问题?
我尝试尽可能多地对此进行研究,但正如大多数程序员所知道的那样,在线搜索并不那么容易,因为搜索引擎似乎受到了限制,甚至没有正则表达式搜索,它就会变成命中或未命中和/或人气竞赛(感兴趣的话题足够受欢迎,可以在 Google 上排名等)。
我非常感谢您对此的提示(甚至不提示)回复。我尝试回答别人的问题,即使这对我来说似乎很容易,并尝试记住知识总是从缺乏知识开始。
【问题讨论】:
你不应该从标准库容器继承:***.com/questions/922248/…. 无法正确解析>>
的模板定义是 VS6 中的一个糟糕的错误,自 VS 2005 起已修复,因此您必须在它们之间放置一个空格,例如 > >
,但是您的第二个除了解析器错误以外,其他的错误是莫名其妙的
@EdChum 我不确定标准要求 >>
正确解析 C++11 之前的模板。
@juanchopanza 我不能引用标准,但我知道这是 Bjarne 在 C++11 和 C++03 之前的编译器中感叹的东西,所以我认为它应该被处理,我不了解其他编译器,但这是 MS 编译器的一个已知问题
@EdChum gcc 不会在没有 C++11 标志的情况下吞下它。我认为 Bjarne S. 感叹该标准没有强制执行正确的解析,因为当时认为向编译器或类似的东西要求太多了。
【参考方案1】:
这可能意味着您的编译器没有像您预期的那样解析 >>
符号,即在这方面它不支持 C++11。
试试这个
std::vector<LPTSTR,std::allocator<LPTSTR> >
^ note space
并阅读why it might not be a good idea to inherit from a standard library container。
至于“为什么 >>> 合法”的问题,嗯,它根本不合法,在 C++03 上不合法,在 C++11 上也不合法。我只能断定这是你编译器的一个特性。
【讨论】:
这没有回答第二部分,它说三个>
有效。
感谢您提供的外部信息,对事物有一些新的看法总是很高兴,而且每一点都帮助很大。【参考方案2】:
class foo : public std::vector<LPTSTR,std::allocator<LPTSTR>>
不编译,因为>>
被视为一个标记,您应该用空格分隔右括号。这在 C++11 中已修复。
另外,您不应该从 std 容器继承,因为它们不是为此而设计的(例如,它们没有虚拟析构函数)。
【讨论】:
接受>>>
可能是一个解析器错误,GCC 不接受三个右括号,也没有任何基于标准的解释。
我还发现每个人的这些信息都提供了丰富的信息和帮助。感谢您的回复。以上是关于从 std::vector 继承的这个类声明有啥问题吗?的主要内容,如果未能解决你的问题,请参考以下文章
std::vector of OpenCV 点,没有 push_back 方法
Std::vector 被初始化为垃圾。奇怪的行为。有啥想法吗?
从 std::vector 继承时 g++ 7 中的未定义引用