使用MSVC ++ 2010,在其声明块之外定义模板化的类成员:
template <typename T> class cls {
public:
template <typename T> void bar(T x);
};
template <typename T> void cls<T>::bar(T x) {}
的产率:
unable to match function definition to an existing declaration
1> definition
1> 'void cls<T>::bar(T)'
1> existing declarations
1> 'void cls<T>::bar(T)'
为什么?
答案 0 :(得分:5)
您需要两个模板声明,因为每个构造都使用不同的模板参数:
template <typename P>
template <typename T>
void cls<P>::bar(T x) {}
但在我看来bar
根本不需要模板化。请改用:
template <typename T>
class cls
{
public:
void bar(T x);
};
template <typename T> void cls<T>::bar(T x) {}
答案 1 :(得分:0)
如果您打算bar
成为会员模板,那么您需要:
template <typename T> class cls {
public:
template <typename U> void bar(U x);
};
template<typename T>
template<typename U>
void cls<T>::bar(U x) { }
请注意,成员的模板参数不得遮蔽类模板参数,因此我将其更改为U
。