小编for*_*rul的帖子

C ++模板化函数重载规则

重载模板化函数时,如果编译器可以选择以下任一选项,则编译器应如何选择要调用的版本:

  • 调用函数的模板版本(例如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());
}
Run Code Online (Sandbox Code Playgroud)

用gcc或clang编译,输出:

func(T)
func(Parent)
func(T)
Run Code Online (Sandbox Code Playgroud)

前两行是预期的并且有意义。但是,在call中func(Child()),它可以像调用一样容易func(Parent)(这似乎(如果有的话)应该执行的操作)。

因此,我有两个主要问题:

  • 该标准针对如何解决此类冲突制定了确切的规则?这个问题/答案中有一些信息,但是如果有任何信息与我所观察到的相冲突。
  • 有什么方法可以强制编译器func(Parent)在传递a时调用Child

我可以在自己的代码中解决此要求,并且此示例是我尝试做的简化版本,但我认为这是相同的问题。

c++ templates overloading overload-resolution

5
推荐指数
1
解决办法
318
查看次数

标签 统计

c++ ×1

overload-resolution ×1

overloading ×1

templates ×1