在C ++ 11别名模板上调用构造函数和运算符

时间:2016-05-10 14:46:41

标签: c++ templates c++11

我目前正在使用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 ++还很陌生,所以它可能只是一个非常讨厌的错误。在这种情况下,我请你提前赦免)。

1 个答案:

答案 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;