2014-09-26 15 views
28

Poniższy kod kompiluje grzywny w GCC, ale w Visual Studio skutkujeDlaczego kolejność parametrów szablonu ma znaczenie dla kompilatora MS C++ w tym przykładzie?

błędu C2782: „bool contains(const T &,const std::initializer_list<T2> &)”: parametr szablonu „T” jest niejednoznaczne oświadczenia znajduje się od „contains” może być „const wchar_t *” lub „std::wstring

Uważa jednak skompilować i działać, jeśli kolejność parametrów szablonu jest podawany jako

template<typename T2, typename T>

Czy to błąd kompilatora?

#include <string> 
#include <iostream> 
#include <set> 
#include <initializer_list> 
#include <algorithm> 

template<typename T, typename T2> 
bool contains(T const& value, std::initializer_list<T2> const& set) 
{ 
    return std::find(std::begin(set), std::end(set), value) != std::end(set); 
} 

int main(void) 
{ 
    std::set<std::wstring> values = { L"bar", L"not" }; 

    for (std::wstring val : values) { 
    std::wcout << "\"" << val << "\" "; 
    if (contains(val, { L"foo", L"bar", L"baz", L"doom" })) { 
     std::wcout << "found" << std::endl; 
    } 
    else { 
     std::wcout << "not found" << std::endl; 
    } 
    } 
} 

Edit: I stworzyli wypełnienie i wysłanie: https://connect.microsoft.com/VisualStudio/feedbackdetail/view/982338/template-parameter-order-matters

+1

Yikes, nie mam nic przeciwko temu ... –

+7

Nie ma sensu ... to znaczy jest błąd :) – jrok

+0

FWIW to _will_ compile, jeśli jawnie określisz drugi argument przekazany jako 'std :: initializer_list < std :: wstring> {...} '. –

Odpowiedz

1

Pamiętam, że VS ma błąd, gdzie zrobiliby podwójnego odliczenia w niektórych scenariuszach, i myślę, że to, co się tutaj dzieje. Clang również kompiluje go w obie strony, więc skoro clang + gcc się zgadza, to jest to prawdopodobnie błąd VS.

1

Miałem podobny problem, który został rozwiązany poprzez przejście na najnowszą wersję VS Pro. Myślę, że ten błąd został rozwiązany w najnowszej wersji pro VS, ponieważ pamiętam, że widziałem to w dzienniku zmian w pewnym momencie.

Powiązane problemy