模板嵌套类方法的单独定义的正确语法
Posted
技术标签:
【中文标题】模板嵌套类方法的单独定义的正确语法【英文标题】:Correct syntax for separate definition of templated nested class methods 【发布时间】:2018-10-24 00:14:03 【问题描述】:我正在编写一个类,除了作为模板允许不同的数字类型之外,还需要一个额外的嵌套类:
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】:见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 /**/
【讨论】:
那么明显吗?我想是调查得太多了,错误消息中说明了答案,但我认为是其他原因造成的。谢谢。以上是关于模板嵌套类方法的单独定义的正确语法的主要内容,如果未能解决你的问题,请参考以下文章
Clang 是不是正确拒绝仅通过特化定义类模板的嵌套类的代码?