【问题标题】:C++ template std::vector::iterator errorC++ 模板 std::vector::iterator 错误
【发布时间】:2014-01-22 22:23:14
【问题描述】:

在 C++ 中,我试图为我的模板类获取 std::vector::iterator。但是,当我编译它时,我得到了错误:error C2146: syntax error : missing ';' before identifier 'iterator'error C4430: missing type specifier - int assumed. Note: C++ does not support default-int。我也收到警告:warning C4346: 'std::vector<T>::iterator' : dependent name is not a type:

#include <vector>
template<class T> class v1{
    typedef std::vector<T>::iterator iterator; // Error here
};
class v2{
    typedef std::vector<int>::iterator iterator; // (This works)
};

我也试过了

template<typename T> class v1{
    typedef std::vector<T>::iterator iterator;
};

template<typename T = int> class v1{
    typedef std::vector<T>::iterator iterator;
};

【问题讨论】:

  • clang++ 已知有相当不错的错误消息,尤其是对于这类错误。在这种情况下,它会在依赖类型名称 'std::vector::iterator' 之前显示 error: missing 'typename'。如果您无法理解来自其他编译器的错误消息,我建议您尝试 clang(例如在在线编译器中)。
  • @DyP GCC 有类似的错误信息。
  • @Rapptz 哦,确实有这个例子:) 这真是一个惊喜。前段时间我最终从 g++ 切换到了 clang++,因为错误消息变得不可读,尽管对于更复杂的情况。

标签: c++ templates vector iterator


【解决方案1】:

std::vector&lt;T&gt;::iterator 是一个dependent name,所以这里需要一个typename 来指定它引用一个类型。否则假定引用非类型:

typedef typename std::vector<T>::iterator iterator;

【讨论】:

    猜你喜欢
    • 2022-01-19
    • 2017-03-23
    • 2013-08-24
    • 2017-07-03
    • 1970-01-01
    • 1970-01-01
    • 2012-11-23
    • 2012-06-18
    • 2015-12-15
    相关资源
    最近更新 更多