类外声明模板构造函数编译失败问题求助
类模板中成员模板构造函数的类外定义语法问题
你的代码无法编译的核心原因是类模板的成员模板构造函数在类外定义时,模板参数的声明顺序和语法不符合C++标准要求,具体问题如下:
错误代码的问题点
你定义的my_class是一个带size_t size参数的类模板,而构造函数又是一个带class int_t参数的成员模板。在类外定义该构造函数时,你错误地将成员模板的参数class int_t放在了类模板参数size_t size前面,并且合并成了一个template声明——这不符合C++的语法规则。
正确的类外定义写法
需要使用嵌套的template声明:先声明类模板的参数,再声明成员模板的参数,两者分开写:
template <size_t size = 1> class my_class { public: template <class int_t> constexpr my_class(int_t); }; // 外层是类模板参数,内层是成员模板参数 template<size_t size> template<class int_t> constexpr my_class<size>::my_class(int_t num) { }
对比你的两种正确写法
- 写法一:将成员模板构造函数直接定义在类内部,此时编译器可以直接关联类模板与成员模板的参数关系,不需要额外处理模板参数的声明顺序,因此语法合法。
- 写法二:构造函数并非成员模板,只是类模板的普通构造函数,只需要声明类模板的参数即可,语法自然正确。
C++标准明确规定:类模板的成员模板在类外定义时,必须使用两层template声明,外层指定类模板的参数,内层指定成员模板的参数,不能将两类参数合并到同一个template列表中。
内容的提问来源于stack exchange,提问作者Loge
相关产品推荐
相关产品推荐

