【问题标题】:Compiler Error: Expected Nested Name Specifier before typedef编译器错误:typedef 之前的预期嵌套名称说明符
【发布时间】:2016-02-24 12:40:20
【问题描述】:

在具有两种实例化类型(TPT)的模板类中,我目前有以下行用于为该类使用 const_iterator

typedef typename std::vector< std::pair<T, PT> >::const_iterator const_iterator;

这在 C++11/14 环境中有效,但是在 C++98 环境中编译时(不幸的是,由于各种原因可能需要)我得到标题中显示的错误,expected nested name specifier before typedef

有什么办法可以解决旧编译器的这个问题吗?

编辑:这是我班级的基本结构,

template<typename T, typename PT> class MyClass {

private:

    std::vector< std::pair<T,PT> > dataWithPriorityVec;    

    //... various private methods...

public:

    typedef typename std::vector< std::pair<T,PT> >::const_iterator const_iterator;

    //... constructors and various public methods...

};

【问题讨论】:

  • 你的“模板类”是什么样子的?
  • 显示一个最小的完整示例。
  • 您的示例在此处的多个编译器版本中可以干净地编译(此外,在const_iterator 之后缺少;)。
  • 在类定义前是否包含&lt;vector&gt;&lt;utility&gt;
  • 是的,不能保证&lt;utility&gt;std::pair 需要)包含在任何其他标准标头中。因此,您用于 C++98 构建的编译器可能要求它正确编译。

标签: c++ c++11 iterator c++98 typename


【解决方案1】:

您是否在类定义前包含&lt;vector&gt;&lt;utility&gt;

您需要"include what you use" 以避免交叉编译问题。

不保证&lt;utility&gt;std::pair 需要)或&lt;vector&gt; 包含在任何其他标准标头中。 如 cmets 中所述。

因此,您用于 C++98 构建的编译器可能要求它正确编译。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-18
    • 1970-01-01
    • 1970-01-01
    • 2011-06-27
    相关资源
    最近更新 更多