我目前正在使用C ++ 11别名模板(又名。template<class A> using B = C<A>;
)重构一些代码,但当我尝试使用别名来实现构造函数或运算符时,clang会抱怨。
相关标头文件:
template<class C>
class CSTree {
public:
class DepthIterator : public std::iterator<std::random_access_iterator_tag, C> {
DepthIterator(const DepthIterator&);
bool operator==(const DepthIterator&);
//other members omitted
}
//other members omitted
}
相关的源文件:
template<class C>
using DeIt = typename CSTree<C>::DepthIterator;
template<class C>
DeIt<C>::DepthIterator(const DepthIterator &rhs) { //Error here!
//...
}
template<class C>
bool DeIt<C>::operator== (const DepthIterator &rhs) { //Error here!
//...
}
使用clang进行编译会出现以下错误:
src/CSTree.cpp:13:10: error: nested name specifier 'DeIt<C>::' for declaration does not refer into a class, class template or class template partial specialization
src/CSTree.cpp:18:15: error: nested name specifier 'DeIt<C>::' for declaration does not refer into a class, class template or class template partial specialization
我试图搜索互联网没有引出关于这个主题的任何明确的材料,所以我想知道是否有可能在Alias模板上实现运算符和构造函数,如果是的话,关于我在哪里犯错的任何提示都是非常感谢(我对C ++还很陌生,所以它可能只是一个非常讨厌的错误。在这种情况下,我请你提前赦免)。
答案 0 :(得分:0)
别名只能在使用相关类时使用,而不能在定义时使用。所以你应该:
template<class C>
CSTree<C>::DepthIterator::DepthIterator(const DepthIterator &rhs) {
//...
}
template<class C>
bool CSTree<C>::DepthIterator::operator== (const DepthIterator &rhs) {
//...
}
template<class C>
using DeIt = typename CSTree<C>::DepthIterator;