c ++:声明多个模板的两种方法

时间:2015-06-15 21:04:36

标签: c++ templates

我有以下代码:

template<typename T>
struct Pair3{
    T first, second;
    Pair3() : first(T()), second(T()) {}
    Pair3(T first, T second) : first(first), second(second) {}
    Pair3(const Pair3<T>& in) : first(in.first), second(in.second) {}
    template<typename U> void copyFrom(Pair3<U> in);
};

template<typename T>
template<typename U>
void Pair3<T>::copyFrom(Pair3<U> in){
    first = in.first;
    second = in.second;
}

为什么我要写

template<typename T>
template<typename U>

在copyFrom实现之前 我不能写:

template<typename T, typename U>.

这意味着什么?为什么会出错? 相反:为什么我不能这样声明struct Pair3

  template<typename T, typename U>
    struct Pair3{
        T first, second;
        Pair3() : first(T()), second(T()) {}
        Pair3(T first, T second) : first(first), second(second) {}
        Pair3(const Pair3<T>& in) : first(in.first), second(in.second) {}
        void copyFrom(Pair3<U> in);
    };

甚至:

template<typename T>
template<typename U>
    struct Pair3{
        T first, second;
        Pair3() : first(T()), second(T()) {}
        Pair3(T first, T second) : first(first), second(second) {}
        Pair3(const Pair3<T>& in) : first(in.first), second(in.second) {}
        void copyFrom(Pair3<U> in);
    };

谢谢!

1 个答案:

答案 0 :(得分:1)

根据标准N4431 §14.5.2/ 1成员模板[temp.mem]( Emphasis Mine ):

模板可以在类或类模板中声明;这样的模板称为成员模板。可以在类定义或类模板定义之内或之外定义成员模板。 应使用类模板的模板参数和成员模板的模板参数指定在其类模板定义之外定义的类模板的成员模板。

[实施例:

template<class T> struct string {
template<class T2> int compare(const T2&);
template<class T2> string(const string<T2>& s) { /∗ ... ∗/ }
};
template<class T> template<class T2> int string<T>::compare(const T2& s) {
}

- 结束示例]

定义为:

template<typename T, typename U>.

这是错误的,因为这不是C ++标准指定如何在模板类定义之外定义类模板的成员模板的方式。