"template<typename>" 是什么意思?

3

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

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

有一个模板函数,但它有奇怪的语法,我真的不理解它是做什么用的。它是否接近于 template<template<typename Ta>>

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


5
注意:在C++中并不存在“模板函数”这一概念,而是存在函数模板。两者之间有一个重要的区别:函数模板本身不是函数,它是用来通过特定的模板参数实例化出函数的模板 - Konrad Rudolph
2个回答

11
有时候,只需要一个完整的例子:
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>();
}

这是一个类模板的方法模板的定义。


2
有时在编写模板时需要兼容对象。例如,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);
}

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接