Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 其他类正文中的模板类别名产生编译错误_C++ - Fatal编程技术网

C++ 其他类正文中的模板类别名产生编译错误

C++ 其他类正文中的模板类别名产生编译错误,c++,C++,我正在制作Visual Studio 2015社区版 以下代码产生错误: #include <list> using std::list; template <typename T> class enumerator { // typedef: public: using list_ = list<T*>; // line: using list_fwd_c = list_::cons

我正在制作Visual Studio 2015社区版

以下代码产生错误:

#include <list>
using std::list;

template <typename T>
class enumerator
{
// typedef: 
public:
    using list_      = list<T*>;                        // line:
    using list_fwd_c = list_::const_iterator;           // 188
    using list_fwd   = list_::iterator;                 // 189
    using list_rvs_c = list_::const_reverse_iterator;   // 190
    using list_rvs   = list_::reverse_iterator;         // 191
};                                                      // 192
#包括
使用std::list;
样板
类枚举器
{
//类型定义:
公众:
使用list_u=list;//行:
使用list\u fwd\u c=list\u::const\u迭代器;//188
使用list_fwd=list_u::迭代器;//189
使用list\u rvs\u c=list\u::const\u reverse\u迭代器;//190
使用list\u rvs=list\u::reverse\u迭代器;//191
};                                                      // 192
错误是:

1>d:\develop\workspace\visual_studio\nevada_test_site\source\shared\cpp\expression_evaluator\expression_evaluator\src\expr_eval.cpp(188): error C2061: syntax error: identifier 'const_iterator'

1>  d:\develop\workspace\visual_studio\nevada_test_site\source\shared\cpp\expression_evaluator\expression_evaluator\src\expr_eval.cpp(192): note: see reference to class template instantiation 'cpplib::eval::utils::enumerator<T>' being compiled

1>d:\develop\workspace\visual_studio\nevada_test_site\source\shared\cpp\expression_evaluator\expression_evaluator\src\expr_eval.cpp(188): error C2238: unexpected token(s) preceding ';'

1>d:\develop\workspace\visual_studio\nevada_test_site\source\shared\cpp\expression_evaluator\expression_evaluator\src\expr_eval.cpp(189): error C2061: syntax error: identifier 'iterator'

1>d:\develop\workspace\visual_studio\nevada_test_site\source\shared\cpp\expression_evaluator\expression_evaluator\src\expr_eval.cpp(189): error C2238: unexpected token(s) preceding ';'

1>d:\develop\workspace\visual_studio\nevada_test_site\source\shared\cpp\expression_evaluator\expression_evaluator\src\expr_eval.cpp(190): error C2061: syntax error: identifier 'const_reverse_iterator'

1>d:\develop\workspace\visual_studio\nevada_test_site\source\shared\cpp\expression_evaluator\expression_evaluator\src\expr_eval.cpp(190): error C2238: unexpected token(s) preceding ';'

1>d:\develop\workspace\visual_studio\nevada_test_site\source\shared\cpp\expression_evaluator\expression_evaluator\src\expr_eval.cpp(191): error C2061: syntax error: identifier 'reverse_iterator'

1>d:\develop\workspace\visual_studio\nevada_test_site\source\shared\cpp\expression_evaluator\expression_evaluator\src\expr_eval.cpp(191): error C2238: unexpected token(s) preceding ';'
1>d:\develop\workspace\visual\u studio\nevada\u test\u site\source\shared\cpp\expression\u evaluator\expression\u evaluator\src\expr\u eval.cpp(188):错误C2061:语法错误:标识符“const\u迭代器”
1> d:\develop\workspace\visual\u studio\nevada\u test\u site\source\shared\cpp\expression\u evaluator\expression\u evaluator\src\expr\u eval.cpp(192):注意:请参阅正在编译的类模板实例化“cpplib::eval::utils::enumerator”
1> d:\develope\workspace\visual_studio\nevada_test_site\source\shared\cpp\expression_evaluator\expression_evaluator\src\expr_eval.cpp(188):错误C2238:在“;”之前的意外标记
1> d:\develop\workspace\visual\u studio\nevada\u test\u site\source\shared\cpp\expression\u evaluator\expression\u evaluator\src\expr\u eval.cpp(189):错误C2061:语法错误:标识符“迭代器”
1> d:\develope\workspace\visual_studio\nevada_test_site\source\shared\cpp\expression_evaluator\expression_evaluator\src\expr_eval.cpp(189):错误C2238:在“;”之前的意外标记
1> d:\develop\workspace\visual\u studio\nevada\u test\u site\source\shared\cpp\expression\u evaluator\expression\u evaluator\src\expr\u eval.cpp(190):错误C2061:语法错误:标识符“const\u reverse\u迭代器”
1> d:\develope\workspace\visual_studio\nevada_test_site\source\shared\cpp\expression_evaluator\expression_evaluator\src\expr_eval.cpp(190):错误C2238:在“;”之前的意外标记
1> d:\develop\workspace\visual\u studio\nevada\u test\u site\source\shared\cpp\expression\u evaluator\expression\u evaluator\src\expr\u eval.cpp(191):错误C2061:语法错误:标识符“反向迭代器”
1> d:\develope\workspace\visual_studio\nevada_test_site\source\shared\cpp\expression_evaluator\expression_evaluator\src\expr_eval.cpp(191):错误C2238:在“;”之前的意外标记
我已经确认这是一个麻烦的代码段(当我注释掉'enumerator'类时,错误消失)

顾名思义,它“将是”一个简单的枚举器类(类似于
C
中的
IEnumerator
。我将使用它来存储从作为类模板参数
T
传递的基类派生的对象列表

问题:
1.上述代码产生此错误的原因。
2.如何修复此错误?

3.我知道这不是一个合适的地方,但是如果你知道这种枚举器的一个很好的实现(
boost
?),请给我指出正确的方向。

你仍然需要添加一个
typename
,尽管使用
非常方便:

using list_fwd_c = typename list_::const_iterator;           // 188
using list_fwd   = typename list_::iterator;                 // 189
using list_rvs_c = typename list_::const_reverse_iterator;   // 190
using list_rvs   = typename list_::reverse_iterator;         // 191

问题在于,这些类型都是依赖类型(它们取决于模板参数),因此编译器不能只知道它们都是类型(而不是函数或静态数据成员)

不,std::list没有任何问题。我包括了这个header@cukier9a7b5:好的,我删除了该部分。将来您可以通过指定此类信息来帮助我们更好地回答问题。请阅读有关生成抱歉的内容,我不认为这可能是一个问题。