【发布时间】:2020-09-27 10:50:28
【问题描述】:
在下面的示例中,函数模板 (quartic) 使用重载的全局函数 (square)。编译时,仅考虑在模板本身之前声明的重载,因此使用 square(int) 而不是 square(double),即使在使用模板之前声明了 square(double)。
int square(int);
template<typename T>
T quartic(T value) {
return square(square(value));
}
double square(double);
double x(double y) {
return quartic(4.0); // Uses square(int), wanted square(double)
}
有没有办法让square的重载版本取决于使用模板时可用的内容,以便用户可以为他使用的任何类型T实现square?
注意:奇怪的是 MSVC 将使用 square(double),而 GCC、clang 和 icc 使用 square(int)。
【问题讨论】:
-
可以添加主函数吗?
-
@yaodav 示例完成(试试gcc.godbolt.org/z/n7bcqr)。
-
应该只考虑在
quartic之前声明的函数。我觉得奇怪的是 MSVC 使用double版本。 -
@TedLyngmo 默认情况下,MSVC 总是在模板实例化时查找,这与标准要求的不同。但它可以通过编译标志禁用。
-
...那个标志是
/permissive-。用它来让 MSVC 在几个方面更正确。
标签: c++ templates overloading