2016-05-22 95 views
1

VS2015 Variadic模板錯誤?

template<typename T0, typename T1, typename ...ArgN> 
bool is_any_test(T0 arg0, T1 arg1, ArgN... argn...) 
    { 
    return arg0 == arg1 || is_any_test<T0, ArgN...>(arg0, argn...); 
    }; 

template<typename T0, typename T1> 
bool is_any_test(T0 arg0, T1 arg1) 
    { 
    return arg0 == arg1; 
    }; 

int wmain(int /*argc*/, const wchar_t* /*argv[]*/) 
    { 
    is_any_test(3,4); 
    return 0; 
    }; 

(可以在這裏http://webcompiler.cloudapp.net/運行)

在VS2015這導致

C2668 ambiguous call to overloaded function 

在VS2013這個工作得很好。 這是一個錯誤還是我錯過了什麼? 有沒有工作? (改變所有的occurancies爲純IFS - 不是一個選項)

+2

函數定義中應該是'ArgN ... argn',而不是'ArgN ... argn ...'。 'argn ...'基本上是告訴參數包擴展,這不是你想要的。 – DeiDei

+3

@DeiDei'ArgN ... argn ...'實際上被解析爲一個參數包,後面跟着一個c-style variadic參數 –

+0

你沒錯!非常感謝。 –

回答

0

錯字。請參閱註釋以瞭解更多詳細信息...

+0

錯別字不屬於主題 - 如果這是真正的答案,請考慮關閉或刪除問題。 – Leushenko

0

我修改你的代碼工作示例(未測試100%..)

template <class T> 
bool is_any_test_impl(T t) { 
    return false; 
} 

template<class T1,class T2,class... Args> 
bool is_any_test_impl(T1 t1, T2 t2, Args&&... args) { 
    return t1 == t2 || is_any_test_impl(std::forward<T1>(t1),std::forward<Args>(args)...); 
} 

template<class... Args> 
bool is_any_test(Args&&... args) 
{ 
    return is_any_test_impl(std::forward<Args>(args)...); 
}; 

/* 
    auto b = is_any_test(1, 2, 3, 4, 5); //false 
    auto b1 = is_any_test(1, 2, 3, 4, 5, 1); //true 
*/