为什么我不需要SFINAE

时间:2017-10-05 10:00:42

标签: c++ c++14

我试图为SFINAE做一个激励性的例子 我注意到你不需要以下内容:

#include <iostream>

using namespace std;

template<typename T>
struct Foo
{
    void add(int count, const T& val) // add "count" number of val's
    {
        cout << "count, val" << endl;
    }

    template<typename It>
    void add(It beg, It end) // add items [beg,end)
    {
        cout << "beg, end" << endl;
    }
};

int main()
{
    int a=1;
    int xx[] = {1,2,3};
    Foo<int> foo;
    foo.add(xx, xx+3);
    foo.add(2, a);
}

编译,运行和打印:

  乞求,结束
  伯爵,瓦朗

try it here

我不明白为什么对add的第二次调用不明确。

1 个答案:

答案 0 :(得分:10)

基本上:

  • 两种超载都是可行的。
  • 两者都是匹配,没有转换/促销。
  • add(int count, const T& val)首选非模板。