Использование Visual Studio и gcc - это известная проблема :) И я использовал VS2003 и gcc 3.4.2, так что некоторое время так было.
Если я правильно помню, проблема связана с тем, как шаблоны анализируются в этих компиляторах.
gcc ведет себя так, как указано в стандарте, и выполняет 2 анализа:
- первый, когда встречается с шаблоном, без какой-либо информации о типах, в этот момент требуется магия
typename
и template
, чтобы помочь понять, что происходит
- секунду при создании экземпляра шаблона с заданным типом
с другой стороны, VS выполняет только один анализ при создании экземпляра и, следовательно, может полностью разрешить символы без typename
и template
здесь и там.
У вас есть то же самое для методов:
template <class Item>
struct Test
{
template <class Predicate>
void apply(Predicate pred);
void doSomething { this->apply(MyPredicate()); } // Visual Studio
void doSomething { this->template apply(MyPredicate()); } // gcc
}; // struct Test
На ту же тему, если вы делаете что-то вроде:
template <class Item>
struct Test { static const std::string Name; };
Вам необходимо определить этот атрибут static
для каждого экземпляра шаблона, иначе у вас будет неопределенный символ.
VS принимает этот синтаксис:
const std::string Test<MyType>::Name = "MyType";
Но gcc запрашивает небольшое ключевое слово:
template <> const std::string Test<MyType>::Name = "MyType";
Вы можете думать о VS как о лучшем, поскольку он требует от вас меньше, но, с другой стороны, gcc может предупредить вас об ошибках в ваших шаблонных методах / классах, как только проанализирует их в первый раз (то есть без какой-либо реальной реализации) и лично, чем скорее, тем лучше.
Очевидно, что хорошая новость заключается в том, что если скомпилировать на gcc (для этих проблем), он также скомпилируется в Visual Studio.
Так как я не стандартист, я не уверен, действительно ли стандарт требует или советует схему 2-парсинга.