2009-08-21 8 views
5

Mam problem z uzyskaniem tego kodu do kompilacji w systemie Linux, ale działa on doskonale w systemie Windows.C++ Problem z szablonem w kodzie międzyplatformowym

Okna kompilator Visual Studio 2005

Linux kompilator: gcc w wersji 3.4.3 20.041.212 (Red Hat 3.4.3-9.EL4)

class DoSomething 
{ 
    public: 
    template <class DataType> 
    bool Execute() 
    { 
     //do something here 
    } 
}; 


template <class Operator> 
TypeSwitch(int DataTypeCode, Operator& Op) 
{ 
    switch (DataTypeCode) 
    { 
    case 1: return Op.Execute<char>(); 
    case 2: return Op.Execute<int>(); 
    //snip; 
    } 
} 

//To call the operator 
TypeSwitch(Code,DoSomething); 

W Windows ten kod działa doskonale i robi dokładnie czego chcę. W Linuksie, dostaję błędy:

błędzie: Oczekuje podstawową ekspresję przed „>” tokena

błędzie: Oczekuje pierwotnej ekspresji przed „)” tokena

dla każdej linii z przypadku komunikat.

Wszelkie pomysły?

Dzięki, Mike

+0

linie Wich są wskazywane przez błędy? – Klaim

+0

Mówi w swoim poście: "dla każdego wiersza z opisem sprawy." – DeusAduro

+0

Jesteś pewien, że ten kod się kompiluje? widzę kilka błędów. Gdzie jest typ zwrotu TypeSwitch? –

Odpowiedz

13

Problem polega na tym, że kiedy kompilator napotka Op.Execute<char>(); i stara się je analizować, to pogubi.

Op jest nazwą zależną, więc kompilator nie wie wiele o swoich elementach. Więc nie wie, że Execute jest funkcją szablonu. Zamiast tego zakłada, że ​​< oznacza mniej niż. Próbujesz porównać nieznanego członka Execute do czegoś innego.

Więc zamiast, linia powinna wyglądać następująco:

case 1: return Op.template Execute<char>(); 

Teraz kompilator wie, że Execute jest szablon, więc gdy napotka < to nie jest „mniej niż”, ale początek szablonu parametry.

Problem jest podobny do tego, jaki jest wymagany typename podczas określania typów należących do nazwy zależnej. Jeśli odwołujesz się do funkcji elementu szablonu, a argumenty szablonu są jawnie podane, potrzebujesz słowa kluczowego template.

Zachowanie GCC jest prawidłowe, a MSVC jest zbyt łagodne. Jeśli dodać słowa kluczowego template, Twój kod będzie działać w obu kompilatorów (i być poprawne zgodnie z normą)

+2

Witaj w cudownym, magicznym świecie reguł parsowania szablonów C++! –

+0

Ah, dzięki! Spróbuję, kiedy wrócę do pracy w poniedziałek rano, ale twój opis brzmi nieźle. Po prostu pokochaj subtelności za pomocą szablonów! – miked

+0

Tylko kontynuacja dla każdego, kto tego potrzebuje: Właśnie wypróbowałem to i odkryłem, że jest znany błąd w MSVC, że powyższa poprawka nie działa. Więc w Windows potrzebujesz Op.Execute (), aw nie-Windowsach potrzebujesz Op.template Execute (). – miked