gpt4 book ai didi

C++ 模板 - 专门化函数

转载 作者:可可西里 更新时间:2023-11-01 15:52:06 26 4
gpt4 key购买 nike

我有以下代码:

//1
template<typename T>
void c(T in) {
cout << "Template c(" << in << ")" << endl;
}
//2
template<>
void c<>(int* in) {
cout << "Template specialization b(" << in << ")" <<endl;
}
//3
template<typename T>
void c(T* in) {
cout << "Template for pointers c(" << in << ")" <<endl;
}
//..
int i = 8;
c(&i);

有人能解释一下为什么在下面的示例中编译器选择函数#3,但是当我改变函数#2 和#3 的顺序时,编译器选择函数#2 吗?

最佳答案

编译器首先选择主模板,然后才确定使用哪个特化。也就是说,在您的情况下,编译器总是选择第二个主模板,即 #3。

但是,由于您在特化函数模板时没有指定模板参数,您的特化会根据其位置特化一个不同的主模板:按照给定的顺序,它特化第一个主模板,当您交换#2 和#3 它专用于第二个主模板。在 14.7.3 [temp.expl.spec] 第 7 段中,标准必须说明以下情况

... When writing a specialization, be careful about its location; or to make it compile will be such a trial as to kindle its self-immolation.

如果你想控制特化实际特化的主模板,你可以在特化中指定模板参数:

template <> void c<int*>(int* in) { ... } // specializes the first primary
template <> void c<int>(int* in) { ... } // specializes the second primary

关于C++ 模板 - 专门化函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18557934/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com