在模板专用化和重载 C++ 方面没有预期的歧义

not getting expected ambiguity on template specialization and overloading c++

本文关键字:方面没 歧义 C++ 重载 专用      更新时间:2023-10-16

>考虑

Class Wow{
    public:
        //main metod
        template<typename T>
        void foo(T t){
            cout << t << endl;
        }
        template<>
        void foo<int>(int t){
            cout << "specialization" << endl;
        }
        void foo(int t){
            cout << "overloading" << endl;
        }
}

主要的是

Wow wow;
wow.foo(2.2);
wow.foo(1);

此输出

2.2
overloading

我的问题是为什么还要编译?实际上,foo的定义是void foo(int)的两倍。

1)为什么会通过?

2)为什么编译器选择重载的?

谢谢

1)因为这里没有问题。有模板函数、函数模板专用化和重载。您可以像这样调用模板专用化:

wow.foo<int>(3);

2)重载比模板专用化有更好的匹配,如果编译器可以用arg调用这个函数。

N4926 13.3.3/1.7

根据这些定义,可行的函数 F1 被定义为 如果对于所有参数,则比另一个可行的函数 F2 更好的函数 i, ICSi(F1) 不是比 ICSi(F2) 更糟糕的转换序列,并且 然后

F1 不是函数模板专用化,F2 是函数 模板专业化