模板<typename> <typename> 模板有什么作用?



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

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

有模板函数,但它有奇怪的语法,我真的不明白。它做什么?它在template<template<typename Ta>>附近吗?

我从来没有遇到过这样的语法,我很困惑。

有时它所需要的只是一个完整的例子:

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>();
}

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

有时在编写模板时需要与兼容对象兼容。例如,CCD_ 2和CCD_。但如果你有一个模板类对象,比如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);
}

注意,我们调用公共方法将data分配给this对象,因为Something<int>Something<double>都是不同的类型。