Mam następujący kod, który nie kompiluje się w Visual C++ 2015, ale działa pod GCC 4.8.4. Zastanawiam się, co jest słuszne? Kod jest tutaj mowa poniżej:przesłonić specyfikator jako parametr szablonu - czy jest prawidłowy?
template <class T> class ATemplate;
template <class R, class A1>
struct ATemplate<R(A1)>{ };
int main()
{
ATemplate<void(int)> x;
// ATemplate<void(int)override> y; //---Does not compile!!!
return 0;
}
Czy to źle używać nadpisanie jak specyfikatorem tutaj poniżej (lub const). Podobny kod istnieje w bibliotece GMock, w której do generowania parametru szablonu (w tym nadpisywania) wykorzystywana jest ekspansja makr, a także faktyczny podpis funkcji.
Visual C++ 2015 produkuje następujący błąd podczas wyjmowania wykomentowane wiersz:
x.cpp(11): error C2062: type 'int' unexpected
x.cpp(11): error C2976: 'ATemplate': too few template arguments
x.cpp(4): note: see declaration of 'ATemplate'
x.cpp(11): error C2079: 'y' uses undefined class 'ATemplate'
jedną z odpowiedzi poniżej wspomnieć, że nadpisać jest bez znaczenia w kontekście wolnych funkcji (ważny punkt) - robi to to znaczy, że GCC jest tutaj błędne. const specyfikator jest również bez znaczenia w tym przypadku (dla darmowych funkcji), ale mimo to dozwolone (przez VC++) ??? Wspomina również, że wirtualne specyfikatory powinny istnieć tylko w deklaracji - to nie ma znaczenia dla tej sprawy (ponieważ nie istnieje żadna definicja). W przypadku słowa kluczowego wirtualnego można pominąć wyprowadzenie, ponieważ nie ma znaczenia, czy kod się kompiluje, ale w przypadku przypadku przesłaniania nie jest on prawidłowy, ponieważ robi dużą różnicę.
Podczas korzystania ReturnType (ArgType Arg) ... możliwe const lub zastąpić specyfikator jako parametr makra (jak GMock robi), ograniczenie narzucone przez VCC wywołuje ten kod nie skompilować (najwyraźniej w przypadku Clang zbyt) . Który jest poprawny?
Standard nie stwierdza, że specyfikator zastąpienia nie będzie używany w tym kontekście (kontekst parametru szablonu?), Prawda?
Sądząc głosów jestem prawdopodobnie brakuje coś oczywistego, ale gdzie jest funkcja chcesz nadpisać? –
@KarolyHorvath nie ma znaczenia –
@KarolyHorvath, tak, to nie ma znaczenia. Opublikowany kod jest minimalny i powoduje błąd. –