最近我偶然发现了这段代码:
template <typename Ta> template <typename Tb>
void SomeClass<Ta>::Function() {}
有模板功能,但是它有奇怪的语法,我不太了解。它有什么作用?在template<template<typename Ta>>
附近吗?
我从未遇到过这样的语法,我很困惑。
答案 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)
有时,编写模板时需要与兼容对象兼容。例如,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);
}
请注意,由于data
和this
的类型不同,因此我们正在调用public方法将Something<int>
分配给Something<double>
对象。