C++ C++;:专业会员要求«;模板<&燃气轮机»;语法

C++ C++;:专业会员要求«;模板<&燃气轮机»;语法,c++,static,g++,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;

我做错了什么

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
模板
活页夹
{
公众:
静态标准::向量*>全部;
节点*来自;
节点*至;
活页夹(节点*fnode,节点*tonode)
{
from=fnode;
to=音调;
活页夹::全部。推回(此);
}
};
std::vector Binder::all=std::vector()//给你

谢谢。

编译器将静态成员的定义解释为专门化(实际上,它是专门化:您给出的声明特定于
T=int
)。这可以通过在定义之前添加
模板
来解决

在模板中定义静态成员有点麻烦:静态成员需要在标题之外定义,只有在您已经知道活页夹的所有可能
T
的情况下才可能


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

模板类的静态成员可以在标题中定义。@Timo似乎不是这样。我在bla.h中移动了包含在bla.cpp和main.cpp中的模板代码。我认为编译器不知道如何像对内联函数那样“统一”全局变量doudou@demeter:~/tmp$g++main.cpp bla.cpp/tmp/ccdgiTrw.o:(.bss+0x0)`Binder::all'/tmp/ccXM1TWJ.o:(.bss+0x0):首先在此处定义collect2:ld返回1个退出状态参见标准中的$3.2/5。它特别允许为类模板定义多个静态数据成员,假设它们位于不同的转换单元中。