类模板静态成员类外定义遇模板参数默认实参报错的解决问询
类模板静态成员外部定义的编译错误解决方法
你碰到的编译错误如下:
error: default argument for template parameter for class enclosing 'ticker<T, E, A>::garbage_element' 51 | E ticker<T,E,A> ::garbage_element; | ^~~~~~~~~~~~~~~
问题出在类模板外部定义静态成员时,不能重复指定模板参数的默认值。你的类定义里已经给模板参数A设置了默认值std::allocator<E>,但在外部定义静态成员的模板声明中,又重复写了A = std::allocator<E>,这违反了C++的语法规则。
正确的外部定义写法
把外部定义的模板声明里的A默认参数去掉即可:
template< template<class, class> class T, class E, class A > E ticker<T,E,A>::garbage_element;
为什么类内inline static写法可以正常编译
从C++17开始,inline修饰的静态成员变量允许直接在类内部完成定义,不需要再在外部提供额外的定义语句,编译器会自动处理它的实例化和链接问题,所以这种写法不会触发编译错误。
完整修正后的代码示例
#include <iostream> #include <vector> template< template<class, class> class T, class E, class A = std::allocator<E> > class ticker { T<E,A>* container; int current_index; bool mode; static E garbage_element; public: // constructors and members fn }; // 去掉A的默认参数,完成静态成员的外部定义 template< template<class, class> class T, class E, class A > E ticker<T,E,A>::garbage_element;
内容的提问来源于stack exchange,提问作者Ammar Tamimi
相关产品推荐
相关产品推荐

