模板<typename>模板<typename>是做什么的?

时间:2020-09-15 07:42:17

标签: c++ templates

最近我偶然发现了这段代码:

template <typename Ta> template <typename Tb>
void SomeClass<Ta>::Function() {}

有模板功能,但是它有奇怪的语法,我不太了解。它有什么作用?在template<template<typename Ta>>附近吗?

我从未遇到过这样的语法,我很困惑。

2 个答案:

答案 0 :(得分:10)

有时候它只是一个完整的例子:

template <typename Ta>
struct SomeClass {
    template <typename Tb>
    void Function();
};


template <typename Ta> template <typename Tb>
void SomeClass<Ta>::Function() {}

int main() {
    SomeClass<int> sc;
    sc.Function<double>();
}

它是类模板的方法模板的定义。

答案 1 :(得分:1)

有时,编写模板时需要与兼容对象兼容。例如,intdouble彼此兼容。但是,如果您有模板类对象,请说Something<int>Something<double>,然后尝试分配它们,将无法使用。在编写复制或移动赋值运算符或构造函数时,尤其要这样做。假设我们有一个类模板Something

template <typename T>
class Something {
public:
    Something();

    Something(const Something& obj) : data(obj.data)
    {
    
    };

 
private:
    T data;
};

int main(){
    Something<int> number;
    Something<double> double_number;

    Something<double> newObj(number);
}

如果尝试执行此操作,它将无法编译。

要编译该文件,请在这种情况下制作副本构造函数的模板。要使其编译,您必须执行以下操作。

template <typename T>
class Something {
public:
    Something();

    template<typename E>
    Something(const Something<E>& obj);

    T get_data() const{
        return data;
    } 
private:
    T data;
};

template<typename T>
template <typename E>
Something<T>::Something(const Something<E>& src): data(src.get_data()){

}

int main(){
    Something<int> number;
    Something<double> double_number;

    Something<double> newObj(number);
}

请注意,由于datathis的类型不同,因此我们正在调用public方法将Something<int>分配给Something<double>对象。