Как установить более строгие правила компиляции в VC при компиляции кода шаблона C ++ - PullRequest
1 голос
/ 30 марта 2011

ребята, Я хочу, чтобы у VC были те же строгие правила компиляции, что и у GCC, когда он компилирует код шаблона c ++. Но я не знаю, как установить это в моем VC9.0 (Visual Studio 2008).

Например, следующий код не разрешен в GCC.

AutoPtr<RefCounted<Shape>> shape;

, поскольку ">>" здесь не разрешено, и gcc просит добавить хотя бы один пробел между ">>".

AutoPtr< RefCounted<Shape> > shape;

VC не будет рассматривать это как ошибку. Насколько я понимаю, VC имеет более слабые ограничения на компиляцию кода шаблона.

Как мне добавить больше ограничений в VC, чтобы сделать его по тем же правилам, что и GCC?

Ответы [ 4 ]

3 голосов
/ 30 марта 2011

Я бы не назвал это ошибкой - C ++ 0x снял это ограничение, поэтому я привыкну к нему. Что еще более важно, Visual Studio с радостью принимает скобки, совместимые с C ++ 03, с пробелом между ними, поэтому я просто воспользуюсь этим и забуду об этом. Нет никакого способа изменить тот факт, что синтаксический анализатор Visual Studio отличается от указанного в стандарте, и это является наименее значимым способом, которым он не соответствует требованиям.

3 голосов
/ 30 марта 2011

Ты не.:( MSVC ++ просто неправильно обрабатывает шаблоны, и вы должны быть осторожны.


Обратите внимание, что ваш конкретный пример на самом деле не является ошибкой в ​​ C ++ 0x , поэтому MSVC2010 будетна самом деле было бы правильно принять это. (Это все же неправильно во многих других вещах, хотя, но стало немного лучше.)

Вы могли бы даже "обмануть" и включить C ++ 0x для вашей компиляции gcc вразрешите это, просто убедитесь, что случайно не используете C ++ 0x, что не может поддерживать MSVC2008 (или MSVC2010!).

1 голос
/ 30 марта 2011
1 голос
/ 30 марта 2011

Я с уважением не согласен с утверждением GMan: «MSVC ++ просто неправильно обрабатывает шаблоны». Вместо этого я бы сказал, что и MSVC, и GCC обрабатывают шаблоны неправильно, каждый по-своему:)

Чтобы разобраться со спецификой компилятора, стоит поддерживать несколько тестовых модулей во время компиляции. Кроме того, современные системы сборки, такие как bjam, можно настроить для запуска краткого модульного теста сразу после компиляции проекта. Поэтому все, что вам нужно будет делать - это время от времени собирать свой проект с помощью gcc toolset (и / или на платформе, отличной от Windows), чтобы убедиться, что все работает как положено.

PS. отрицательные голоса не мои :) 1005 *

...