Я согласен, что это ошибка, но некоторое понимание того, что происходит, можно получить, сгенерировав список сборок, соответствующий вашему файлу (используйте параметр / Fa файла cl.exe).
Итак, закомментируйте объявление using, сгенерируйте файл .asm и откройте его в текстовом редакторе.Просканируйте файл, и вы увидите, что экземпляр шаблона находится внизу файла (он начинается с ??$TemplatedFunction@H@Ambiguity@@YAXH@Z PROC
) и находится под сборкой, созданной для основной функции (начинается с _main PROC
).В сообщении об ошибке говорится «см. Ссылку на создание экземпляра шаблона функции», поэтому оно ссылается на создание экземпляра функции шаблона, и в листе сборки ясно, что это создание находится внизу файла.
Теперь отредактируйтекод для замены функции шаблона на NonTemplatedFunction(int a)
и компиляции, генерируя листинг сборки.Просмотрите список сборок, и вы увидите, что код сборки, сгенерированный для NonTemplatedFunction(int a)
, отображается выше _main PROC
.
Что означает эта болтовня?Когда компилятор Visual Studio 2008 превращает ваши шаблоны в реальный код, он фактически добавляет некоторый код в конец вашего файла после объявления об использовании.Ваше объявление об использовании означает, что имена в автоматически сгенерированном коде «неоднозначны».Процесс, который gcc использует для создания экземпляров шаблонов, очевидно, позволяет избежать этой проблемы.