最近我偶然发现了这段代码:
template <typename Ta> template <typename Tb>
void SomeClass<Ta>::Function() {}
有一个模板函数,但它有奇怪的语法,我真的不理解它是做什么用的。它是否接近于 template<template<typename Ta>>
?
我从未遇到过这样的语法,很困惑。
最近我偶然发现了这段代码:
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>();
}
这是一个类模板的方法模板的定义。
int
和double
是彼此兼容的。但是,如果您有一个模板类对象,比如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);
}
Something<int>
和Something<double>
都是不同的类型。