C++:specializing成员需要«template <>»语法

Ben*_*man 5 c++ static g++

我究竟做错了什么?

template<class T>
class Binder
{
public:
    static std::vector< Binder< T >* > all;
    Node<T>* from;
    Node<T>* to;
    Binder(Node<T>* fnode, Node<T>* tonode)
    {
        from = fnode;
        to = tonode;
        Binder<T>::all.push_back(this);
    }
};

std::vector<Binder<int>*> Binder<int>::all = std::vector< Binder<int>* >(); //here it is
Run Code Online (Sandbox Code Playgroud)

谢谢.

syl*_*eux 7

编译器将静态成员的定义解释为专门化(实际上,它一种特殊化:您将提供特定于的声明T = int).这可以通过template<>在定义之前添加来修复.

在模板中定义静态成员有点令人失望:静态成员需要在标题之外定义,只有当您已经知道T绑定器的所有可能性时才可以这样做.

例如,现在你正在定义它T=int.现在,如果你开始使用Binder<double>某个地方,静态成员将是一个未定义的引用.

  • 可以在标头中定义模板类的静态成员. (2认同)