3

使用 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)'

为什么?

4

2 回答 2

6

您需要两个模板声明,因为每个构造都适用于不同的模板参数:

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) {}
于 2013-05-10T22:17:08.423 回答
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.

于 2013-05-10T22:18:17.027 回答