这个继承自std :: vector的类声明有什么问题吗?

时间:2012-05-08 10:11:12

标签: c++ visual-studio compiler-errors class-design stdvector

我意识到那里有更好的编译器,但我更喜欢坚持使用vc6,每隔一段时间,我发现奇怪的吸虫,并想知道这个是本地化我的装置还是每个人的。

请记住,有问题的编译器是:
Microsoft(R)32位C / C ++优化编译器版本12.00.8168(适用于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:语法错误:缺少'&gt;'在'{'

之前

现在,真正的问题是,为什么这是合法的:

10: class foo : public std::vector<LPTSTR,std::allocator<LPTSTR>>> 
11: {
12:   public:
13:   foo();
14:   ~foo();
15: };

请注意第10行末尾的额外> ...以及我想知道的是:

  1. 做错了什么?
  2. 这只发生在我的安装上吗?
  3. 我应该避免使用变通方法,因为它可能会在某种程度上导致问题吗?
  4. 我试图尽可能多地研究这个问题但是因为大多数程序员都知道在线搜索并不容易,因为搜索引擎似乎远没有限制甚至没有正则表达式搜索它会成为命中注定和/或人气竞赛(感兴趣的主题很受欢迎,可以在Google上排名等)。

    我提前感谢你对这个问题的提示(甚至没有提示)。我试着回答别人的问题,即使这对我来说太容易了,并且试着记住知识总是从缺乏知识开始。

2 个答案:

答案 0 :(得分:5)

这可能意味着您的编译器没有按预期解析>>符号,即它在这方面不支持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

关于“为什么&gt;&gt;&gt;合法”的问题,嗯,它根本不合法,不是C ++ 03,不是C ++ 11。我只能得出结论,这是编译器的一个特性。

答案 1 :(得分:4)

class foo : public std::vector<LPTSTR,std::allocator<LPTSTR>>

无法编译,因为>>被视为一个标记,您应该将结束括号与空格分开。这已在C ++ 11中修复。

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