Лучшее место: здесь. Каждый раз, когда я спросил, я стал корректным ответы меньше чем за 20 минут. Быстрее это где-либо еще.
Проблема в том, что когда компилятор встречает Op.Execute
и пытается его разобрать, он сбивается с пути.
Op
является зависимым именем, поэтому компилятор мало что знает о его членах. Таким образом, он не знает, что Execute
является функцией шаблона. Вместо этого предполагается, что <
означает меньше чем.
То, что вы пытаетесь сравнить какой-то неизвестный член Execute
с чем-то другим.
Вместо этого строка должна выглядеть так:
case 1: return Op.template Execute<char>();
Теперь компилятор знает, что Execute
является шаблон, поэтому, когда он встречает <
, это не «меньше чем», а начало параметров шаблона.
Проблема аналогична тому, как вам нужно typename
при указании типы, принадлежащие зависимому имени. Когда вы ссылаетесь на функцию-член шаблона и аргументы шаблона указываются явно, вам понадобится ключевое слово template
.
GCC работает правильно, а MSVC слишком снисходителен. Если вы добавите ключевое слово template
, ваш код будет работать в обоих компиляторах (и будет соответствовать стандарту)
case 1: return Op.template Execute<char>();
case 2: return Op.template Execute<int>();
См .: шаблон
как квалификатор
Кроме того, TypeSwitch () возвращает логическое значение