没有预料到模板专业化和重载c ++的歧义

时间:2016-01-20 12:02:27

标签: c++ overloading template-specialization

考虑

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 个答案:

答案 0 :(得分:1)

1)因为这里没有问题。有模板功能,功能模板专用和重载。您可以像这样调用模板专业化:

wow.foo<int>(3);

2)如果编译器可以使用arg调用此函数,则重载与模板特化相比具有更好的匹配。

n4926 13.3.3 / 1.7

  

鉴于这些定义,可行函数F1被定义为a   如果对于所有参数,比另一个可行函数F2更好的功能   i,ICSi(F1)的转换序列不比ICSi(F2)差,并且   然后

     

F1不是功能模板专用,F2是功能   模板专业化