2016-05-22 5 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 на равнинных МФС - это не вариант)

+2

Должно быть «ArgN ... argn», а не 'ArgN ... argn ...' в определении функции. 'argn ...' в основном говорит пакет параметров для расширения, что не то, что вы хотите. – DeiDei

+3

@DeiDei 'ArgN ... argn ...' фактически анализируется как пакет параметров, за которым следует вариационный аргумент c-style –

+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 
*/ 
Смежные вопросы