2010-10-23 89 views
3

我可以调用从静态成员函数的非静态成员函数模板,其中定义被分成头和CPP:C++中的非成员静态模板方法定义?

// 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中定义的函数。

最初我以为这是由于命名空间问题,但所有文件现在都在相同的命名空间。我在这里做什么根本错误?

+0

这是一个重复百万次以上,但是在实际发现事物时太糟糕了。愚蠢的SO搜索。 – GManNickG 2010-10-23 20:10:45

回答

4

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

// one.hpp 

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

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

+0

当然是的,我总是对此感到困惑。如果定义在其他头文件中仍然可用,我可以在一个头文件中转发声明模板函数。你说得对,没有理由在这种情况下是静态的。 – Dan 2010-10-23 20:42:55

2

作为GMan回答的一个补充,我想指出的是,您不能让T&绑定到一个右值,例如类型为int的整数字面值5。 5不会与int&绑定,但会绑定到const int&

相关问题