【发布时间】:2015-07-22 12:46:38
【问题描述】:
当重载一个模板化函数时,如果编译器可以选择调用哪个版本的函数:
- 调用函数的模板版本(例如
func<T>(foo))。 - 调用函数的重载版本,该版本本身没有模板化,但传递给函数的参数类型继承自重载函数模板中指定的类型。
考虑以下 C++ 代码:
#include <stdio.h>
struct Parent {};
struct Child : public Parent {};
template <typename T>
void func(T) {
printf("func(T)\n");
}
void func(Parent) {
printf("func(Parent)\n");
}
int main() {
func(1);
func(Parent());
func(Child());
}
使用 gcc 或 clang 编译,输出:
func(T)
func(Parent)
func(T)
前两行是预期的并且有意义。但是,在调用 func(Child()) 时,它可以很容易地调用 func(Parent)(如果有的话,这似乎是它应该做什么)。
因此,我有两个主要问题:
- 标准中关于如何解决此类冲突的确切规则是什么?有一些信息in this question/answer,但如果有什么与我观察到的冲突。
- 有什么方法可以强制编译器在传递
Child时调用func(Parent)?
我可以在我自己的代码中解决这个要求,这个例子是我正在尝试做的一个简化版本,但我相信这是同样的问题。
【问题讨论】:
-
问题的第二部分请参阅stackoverflow.com/questions/14797303/…。
标签: c++ templates overloading overload-resolution