为什么显式模板实例化不起作用
Why the explicit template instantiation doesn't work
您能否解释一下,为什么显式模板实例化在这里不起作用?
template <typename T>
bool IsEqual(T v1, T v2) {
return v1 == v2;
}
template bool IsEqual<double>(double a, double b);
int main() {
int c = 4;
double d = 4.0;
IsEqual(c,d)
return 0;
}
代码生成的错误是:
note: template argument deduction/substitution failed:
note: deduced conflicting types for parameter 'T' ('int' and 'double')
如果该函数不是模板函数,那么一切正常。因此,我希望显式实例化来创建相同的函数。
bool IsEqualT (double a, double b) {
return a == b;
}
手动踩踏
template bool IsEqual<double>(double a, double b)
不会阻止编译器在
IsEqual(c,d)
它只是告诉编译器,无论它可能消灭什么其他函数,你都希望它在double
秒内消灭该函数。
因此,由于您仍然要进行模板参数推导,并且int
与double
不同,因此您会收到编译器错误。 您必须将c
转换为双精度值,或者重写函数以具有 2 个模板参数,以便它可以采用两种不同的类型。
模板参数推导不关心显式实例化或重载解析。
如果要调用IsEqual
或将其声明更改为
template <typename T, typename S>
bool IsEqual(T v1, S v2) {
return v1 == v2;
}
// ... main
int c = 4;
double d = 4.0;
printf("%s", IsEqual(c,d) == true ? "True" : "False"); // Prints true
或者通过将T
指定为double
来帮助编译器选择正确的重载。
IsEqual<double>(c,d);
显式模板实例化保证编译器为一组特定的模板参数生成代码,这意味着如果链接器需要它,就会找到它。
它不会隐藏模板参数的其他组合,也不会阻止它们被实例化(隐式或其他方式(。
因此,显式实例化对模板参数推导没有影响,对重载解析也没有影响。 整个可能的实例化家族仍然是候选者。
相关文章:
- 内部结构初始化不起作用 - C++
- 即使我正在.cpp文件中实例化一个伪对象,.cpp文件内模板函数的定义也不起作用
- 为什么显式模板实例化不起作用
- 函数模板中的显式模板专用化不起作用
- 为什么显式模板实例化不起作用?
- 完整的模板专用化不起作用:没有与指定类型匹配的函数模板"mysort2"实例 STLests
- 使用初始化列表的 POD 类型初始化不起作用
- 使用 fwrite/fread 对矩阵进行二进制(反)序列化不起作用
- POD变量的直接初始化不起作用,但当将变量推到向量上时,复制初始化起作用
- 函数专用化不起作用
- 窗口可防止多个实例代码不起作用
- 方法的简单专用化不起作用(C++)
- GCC 4.8.1 中的C++11:复制构造函数的列表初始化不起作用
- 模板部分专用化不起作用
- 为什么这种初始化不起作用
- 当比较sizeof(type) == constant时,c++模板特化不起作用
- boost::chrono::时间点类型的序列化不起作用
- std::list类型可变变量的boost序列化不起作用
- 嵌套结构的boost序列化不起作用
- 初始化不起作用