C ++中的非成员静态模板化方法定义?

时间:2010-10-23 20:05:06

标签: c++ templates linker static-methods

我可以从静态成员函数调用非成员静态模板化函数,其中定义被拆分为header和cpp:

// zero.cpp

class Zero
{
    static void zero() { one(5); }
};

// one.h

template <typename T>
static void one(T& var);

// one.cpp

template <typename T>
void one(T& var) { }

// main.cpp

...

Zero::zero()

...

我遇到问题需要链接,我一直在对我试图在one.cpp中定义的函数进行未定义的引用。

最初我认为这是由于命名空间的问题,但所有文件现在都在同一个命名空间中。我在这里做了什么根本性的错误吗?

2 个答案:

答案 0 :(得分:4)

模板定义需要在实例化时可见。也就是说,它需要以某种方式在标题中:

// one.hpp

template <typename T>
static void one(T& var)
{
    // definition visible in header
}

虽然我不确定你为什么要它是静态的。

答案 1 :(得分:2)

作为对GMan回答的补充,我想请注意,您不能将T&绑定到右值,例如5类型的整数文字int。 5不会绑定到int&,但会绑定到const int&