шаблонная проблема C++ в межплатформенном коде

Лучшее место: здесь. Каждый раз, когда я спросил, я стал корректным ответы меньше чем за 20 минут. Быстрее это где-либо еще.

5
задан miked 21 August 2009 в 22:10
поделиться

2 ответа

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

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

Вместо этого строка должна выглядеть так:

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

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

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

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

13
ответ дан 18 December 2019 в 13:17
поделиться
 case 1: return Op.template Execute<char>();
 case 2: return Op.template Execute<int>();

См .: шаблон как квалификатор

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

1
ответ дан 18 December 2019 в 13:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: