正确的语法,用于模板化嵌套类方法的单独定义

时间:2018-10-24 00:14:03

标签: c++ class templates header

我正在编写一个类,该类需要一个额外的嵌套类,除了作为允许不同数字类型的模板之外,还可以:

template<typename _type>
class myClass{
    // ...
    class myNestedClass{
        myNestedClass(int v1, int v2);
        myNestedClass& operator= (std::vector<int> _vals);
        operator std::vector<_type>() const;
        // ...
    }
    // ...
    template <typename _input_type> operator*= (_input_type _val);
    // ...
}

我掌握了大多数语法,尤其是在类定义后如何定义方法:

template <typename _type> 
template <typename _input_type>
myClass<_type>& myClass<_type>::operator*=(_input_type _val){ /* */ };

但是对于嵌套类方法,我无法遵循相同的方案:

template <typename _type> 
myClass<_type>::myNestedClass::myNestedClass(int v1, int v2) { /* */ };

template <typename _type> 
myClass<_type>::myNestedClass& 
template <typename _type> myClass<_type>::myNestedClass::operator= (std::vector<int> _vals) { /* */ }

template <typename _type> 
myClass<_type>::myNestedClass::operator std::vector<_type> () const { /**/ };

但是编译器抱怨最后两个方法的定义是error: need 'typename' before 'myClass<_type>::myNestedClass' because 'myClass<_type>' is a dependent scope

那我到底写错了什么?

1 个答案:

答案 0 :(得分:2)

请参见When is the "typename" keyword necessary?

无论如何,你都非常亲密。修复后(加上一些错字):

template<typename _type>
class myClass{
    // ...
    class myNestedClass{
        myNestedClass(int v1, int v2);
        myNestedClass& operator= (std::vector<int> _vals);
        operator std::vector<_type>() const;
        // ...
    };
    // ...
    template <typename _input_type> myClass<_type>& operator*= (_input_type _val);
    // ...
};

template <typename _type> 
template <typename _input_type>
myClass<_type>& myClass<_type>::operator*=(_input_type _val){ /* */ }

template <typename _type>
myClass<_type>::myNestedClass::myNestedClass(int v1, int v2) { /* */ }

template <typename _type> 
typename myClass<_type>::myNestedClass& myClass<_type>::myNestedClass::operator= (std::vector<int> _vals) { /* */ }

template <typename _type> 
myClass<_type>::myNestedClass::operator std::vector<_type> () const { /**/ }