C++使用using定义vector迭代器别名后模板类构造函数编译报错如何解决
问题原因
你定义的ConstIterator_t是带模板参数的别名模板,使用时必须传入模板参数才能得到具体的可使用类型。你在Sequence<T>类的构造函数参数中直接写未指定模板参数的ConstIterator_t,编译器无法识别这是一个合法类型,因此抛出expected ')' before 'start'的语法错误。
当你替换为别名的原始定义typename std::vector<T>::const_iterator时,你显式指定了模板参数为当前类的T,同时原始定义中的typename关键字告诉编译器该标识符是一个依赖模板参数的类型,因此编译可以正常通过。
修复方案
有两种常用修复方式:
方式1:直接为别名模板传入参数
在构造函数参数的ConstIterator_t后显式传入当前类的模板参数T即可:
template <class T> class Sequence{ public: Sequence(ConstIterator_t<T> start, ConstIterator_t<T> end); //其余代码 };
因为你在定义ConstIterator_t别名时已经添加了typename关键字标记依赖类型,使用时不需要额外再加typename。
方式2:类内定义绑定当前T的别名
如果希望类内部可以直接简化使用迭代器类型,可以在类内部预先定义绑定了当前T的别名:
template <class T> class Sequence{ public: using ConstIterator = ConstIterator_t<T>; Sequence(ConstIterator start, ConstIterator end); //其余代码 };
这种方式后续在类内其他地方使用该迭代器类型时也不需要重复写模板参数,代码更简洁。
内容的提问来源于stack exchange,提问作者Bouraoui Hamadou
相关产品推荐
相关产品推荐

