C++ 编译器在为未定义函数选择正确重载方面的差异
让我们看看下面的代码:C++ 编译器在为未定义函数选择正确重载方面的差异,c++,overloading,C++,Overloading,让我们看看下面的代码: //template <typename ... A> //void foo(char a, A ... args); template <typename T> void P(T x) { std::cout << x << ' '; } void foo(char a) { P(3); P(a); } template <typename ... A> void foo(int a, A ... arg
//template <typename ... A>
//void foo(char a, A ... args);
template <typename T> void P(T x) { std::cout << x << ' '; }
void foo(char a) { P(3); P(a); }
template <typename ... A>
void foo(int a, A ... args)
{
foo(args...);
P(a);
}
template <typename ... A>
void foo(char a, A ... args)
{
P(a);
foo(args...);
}
int main()
{
foo('1', '2', 48, '4', '5');
}
//模板
//void foo(字符a、a…args);
模板void P(T x){std::coutMSVC无法按照标准的规定为模板实现。此编译器错误地将所有名称解析延迟到模板实例化点
其他编译器在模板定义点正确解析非依赖名称。这就是您观察到的差异的原因。在定义点,第二个foo
模板是不可见的,因此符合条件的编译器无法使用它。但在实例化点,它是可见的,MSVC很高兴地找到了它。这是一个w这是MSVC的一个已知问题。它不实现模板的两阶段查找。如果使用常规函数而不是模板,则应该没有区别。@n.m:答案:↓↓↓↓↓↓对不起,哪边?↛ ↜ ↬ 我迷路了!