2015-10-03 5 views
5

Czy ten kod jest dobrze sformułowany? Deklaracja samego szablonu funkcji powoduje błąd zarówno w klangu, jak iw gcc, nawet jeśli Ts może być pusty.Wiele rozszerzeń w pakiecie w klasie o stałej liczbie argumentów szablonu

// error: too many template arguments for class template 'pair' 
template<class I, class U, class... Ts> 
void f(std::pair<I,U,Ts...>); 

int main() 
{ 
    f(std::pair<int,int>()); 
} 

Wywołanie funkcji daje ten błąd w gcc, które nie ma sensu. Nie ma konwersja do int:

note: cannot convert 'std::pair<int, int>()' (type 'std::pair<int, int>') to type 'int' 
+0

Spróbuj użyć std :: tuple zamiast std :: pair, jeśli używasz więcej niż 2 argumenty. –

Odpowiedz

4

[temp.res]/8:

Jeśli każdy ważny specjalizacja o zmiennej liczbie argumentów szablonu wymaga pusty szablonu parametr pakiet, szablon jest źle sformułowane , nie wymaga diagnostyki .

Każda ważna specjalizacja f wymagałaby, aby Ts była pustą paczką. Dlatego program jest źle sformułowany NDR. Oba kompilatory są poprawne.

Jeśli chodzi o diagnostykę GCC, wydaje się, że jest to spowodowane jego zwyczajem używania int jako symbolu zastępczego dla "czegoś, co wygląda na typ, ale nie ma sensu" dla celów odzyskiwania błędów.

Powiązane problemy