2009-08-21 6 views
5

У меня возникли проблемы с компиляцией этого кода в Linux, но он отлично работает в Windows.проблема с шаблоном C++ в межплатформенном коде

Windows, составитель: Visual Studio 2005

Linux компилятор: GCC версии 3.4.3 20041212 (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); 

В Windows этот код работает отлично и делает именно то, чего я хочу. В Linux, я получаю ошибки:

ошибка: ожидается, первичное-выражение перед «>» лексем

ошибка: ожидается первичной экспрессией до «)» маркера

для каждой из линий с корпусом заявление.

Любые идеи?

Спасибо, Майк

+0

Wich линии указаны ошибки? – Klaim

+0

Он говорит в своем посте: «для каждой строки с заявлением дела». – DeusAduro

+0

Вы уверены, что код компилируется? я вижу несколько ошибок. Где тип возврата TypeSwitch? –

ответ

13

Проблема в том, что, когда компилятор встречает Op.Execute<char>(); и пытается разобрать его, он запутывается.

Op - зависимое имя, поэтому компилятор мало знает о его членах. Поэтому он не знает, что Execute является функцией шаблона. Вместо этого предполагается, что значение < меньше. Что вы пытаетесь сравнить неизвестного члена Execute с чем-то другим.

Так вместо этого, строка должна выглядеть следующим образом:

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

Теперь компилятор знает, что Execute шаблон, поэтому, когда он встречает < не «меньше», а начало шаблона параметры.

Проблема похожа на то, как вам нужно typename при указании типов, относящихся к зависимому имени. Когда вы обращаетесь к функции-члену шаблона, и аргументы шаблона указаны явно, вам нужно ключевое слово template.

Поведение GCC верное, а MSVC является слишком снисходительным. Если добавить template ключевое слово, ваш код будет работать в обоих компиляторов (и быть правильным в соответствии со стандартом)

+2

Добро пожаловать в чудесный волшебный мир правил синтаксического анализа на C++! –

+0

А, спасибо! Я попробую, когда вернусь к работе в понедельник утром, но ваше описание звучит как раз. Просто любите тонкости с шаблонами! – miked

+0

Просто следите за тем, кому это нужно: я просто попробовал это, обнаружив, что в MSVC есть известная ошибка, что указанное исправление не работает. Поэтому в Windows вам понадобится Op.Execute (), а в не-окнах вам понадобится Op.template Execute (). – miked

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

См: template as qualifier

Кроме того, TypeSwitch() возвращает логическое значение

Смежные вопросы