从 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 行末尾的额外 &gt;... 我想知道的是:

    是不是做错了什么? 这仅发生在我的安装中吗? 我是否应该避免使用该解决方法,因为它可能会在以后以某种方式导致问题?

我尝试尽可能多地对此进行研究,但正如大多数程序员所知道的那样,在线搜索并不那么容易,因为搜索引擎似乎受到了限制,甚至没有正则表达式搜索,它就会变成命中或未命中和/或人气竞赛(感兴趣的话题足够受欢迎,可以在 Google 上排名等)。

我非常感谢您对此的提示(甚至不提示)回复。我尝试回答别人的问题,即使这对我来说似乎很容易,并尝试记住知识总是从缺乏知识开始。

【问题讨论】:

你不应该从标准库容器继承:***.com/questions/922248/…. 无法正确解析 &gt;&gt; 的模板定义是 VS6 中的一个糟糕的错误,自 VS 2005 起已修复,因此您必须在它们之间放置一个空格,例如 &gt; &gt;,但是您的第二个除了解析器错误以外,其他的错误是莫名其妙的 @EdChum 我不确定标准要求 &gt;&gt; 正确解析 C++11 之前的模板。 @juanchopanza 我不能引用标准,但我知道这是 Bjarne 在 C++11 和 C++03 之前的编译器中感叹的东西,所以我认为它应该被处理,我不了解其他编译器,但这是 MS 编译器的一个已知问题 @EdChum gcc 不会在没有 C++11 标志的情况下吞下它。我认为 Bjarne S. 感叹该标准没有强制执行正确的解析,因为当时认为向编译器或类似的东西要求太多了。 【参考方案1】:

这可能意味着您的编译器没有像您预期的那样解析 &gt;&gt; 符号,即在这方面它不支持 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 上也不合法。我只能断定这是你编译器的一个特性。

【讨论】:

这没有回答第二部分,它说三个&gt; 有效。 感谢您提供的外部信息,对事物有一些新的看法总是很高兴,而且每一点都帮助很大。【参考方案2】:
class foo : public std::vector<LPTSTR,std::allocator<LPTSTR>>

不编译,因为&gt;&gt; 被视为一个标记,您应该用空格分隔右括号。这在 C++11 中已修复。

另外,您不应该从 std 容器继承,因为它们不是为此而设计的(例如,它们没有虚拟析构函数)。

【讨论】:

接受&gt;&gt;&gt; 可能是一个解析器错误,GCC 不接受三个右括号,也没有任何基于标准的解释。 我还发现每个人的这些信息都提供了丰富的信息和帮助。感谢您的回复。

以上是关于从 std::vector 继承的这个类声明有啥问题吗?的主要内容,如果未能解决你的问题,请参考以下文章

std::vector of OpenCV 点,没有 push_back 方法

Std::vector 被初始化为垃圾。奇怪的行为。有啥想法吗?

从 std::vector 继承时 g++ 7 中的未定义引用

如何从 STL 类“继承”迭代器?

boost::container::vector 和 std::vector 有啥区别

为啥不能对 std::vector 使用前向声明?