Как я могу использовать g ++ mimic MSVC ++ для создания шаблонов? - PullRequest
5 голосов
/ 21 июня 2011

Я пытаюсь перенести свою собственную библиотеку из Visual Studio на g ++ в GNU / Linux, и у меня возникают некоторые проблемы с компиляцией шаблонов. Действительно, в Visual C ++ шаблоны генерируются только тогда, когда они явно используются в коде, в то время как (из моих ошибок) кажется, что g ++ оценивает содержимое шаблонов перед их первым использованием. Это приводит к следующей ошибке:

error: incomplete type ‘X’ used in nested name specifier

... потому что я включаю некоторые классы после кода шаблона, а не до. Я делаю это из-за конфликта между пользователями.

Подводя итог, кажется, что Visual C ++ не пытается разрешить содержимое шаблонов при использовании, а g ++ выполняет разрешение как можно скорее.

class MyClass;
template<class _Ty>
void func(MyClass* a_pArg)
{ 
   a_pArg->foo();
};

(_ Тай не используется, но это не имеет значения, это просто для объяснения проблемы)

В этом случае Visual C ++ будет компилироваться (даже если MyClass не объявлен заранее), а g ++ - нет, поскольку MyClass не был полностью объявлен.

Есть ли способ заставить g ++ создавать шаблоны только при использовании?

Ответы [ 4 ]

9 голосов
/ 21 июня 2011

Нет, так работает двухфазный поиск.MSVC реализует это неправильно, он почти пропускает первый этап, который анализирует шаблон в точке определения.MSVC выполняет здесь только базовую проверку синтаксиса.На втором этапе, при фактическом использовании шаблона, зависимые имена должны только проверяться.MSVC выполняет все виды анализа здесь.GCC правильно реализует двухфазный поиск.

В вашем случае, поскольку MyClass не является параметром шаблона, он может проверить его на первом этапе.Вам просто нужно , чтобы включить заголовок вашего класса перед этим.

1 голос
/ 21 июня 2011

Если вы хотите использовать CLang вместо gcc, CLang поддерживает -fdelayed-template (выделенный для выполнения создания шаблона в конце синтаксического анализа), подразумеваемый параметром -fms-extensions, специально разработанным для компиляции кода MSVC (и многочисленными причудами).

По словам Франсуа Пише, который возглавляет усилия CLang по полной компиляции кода MSVC (и фактически делает большую его часть), CLang должен иметь возможность анализировать весь код MFC примерно через 2-3 месяца, причем толькоосталось пару нетривиальных вопросов.Уже большая часть MFC правильно интерпретируется (то есть интерпретируется как VC ++).

1 голос
/ 21 июня 2011

Как было указано в другом ответе, gcc правильно ищет независимые имена на первом этапе поиска, а VC ++ переносит большинство проверок на второй этап (что неверно).Чтобы исправить ваш код, вам не нужно искать какую-то сломанную версию gcc.Вам нужно разделить объявление и реализацию (по крайней мере, для независимых имен).Используя ваш пример,

// provide declarations
class MyClass;

template<class T>
void func(MyClass* a_pArg);

// provide definition of MyClass
class MyClass
{
   // watever
};

// provide definition of func
template<class T>
void func(MyClass* a_pArg);
{ 
   a_pArg->foo();
};
0 голосов
/ 26 марта 2016

Visual C ++ по умолчанию не поддерживает двухфазный поиск, указанный в стандарте.

Однако в Visual Studio 2015 с параметром / Za выглядит немного лучше, чем двухфазный поиск.Возможно, вы можете сделать обратное, добавив параметр / Za для имитации поведения экземпляра шаблона GCC в некоторых случаях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...