История изменений
Исправление rumgot, (текущая версия) :
Вандевурд, Дэвид, Джосаттис, Николаи М., Грегор, Дуглас. Шаблоны C++. Справочник разработчика, 2-е изд Глава 9.1.1:
Компилятор C++, вероятно, примет эту программу без каких-либо проблем, но компоновщик, скорее всего, сообщит об ошибке отсутствия определения функции printTypeof(). Причиной этой ошибки является то, что определение шаблона функции printTypeof() не инстанцировано. Чтобы шаблон был инстанцирован, компилятор должен знать, какие определения должны быть инстанцированы и для каких именно аргументов шаблона. К сожалению, в предыдущем примере эти две части информации находятся в файлах, компилируемых по отдельности. Таким образом, когда наш компилятор видит вызов printTypeof (), но не имеет определения шаблона, чтобы инстанцировать его для double, он просто предполагает, что такое определение представлено в другом месте, и создает для этого определения соответствующую ссылку (разрешаемую компоновщиком). С другой стороны, когда компилятор обрабатывает файл myfirst.срр, он не имеет никаких указаний о том, что он должен инстанцировать определение содержащегося в нем шаблона для некоторых конкретных аргументов.
Далее Глава 9.1.2 9.1.2. Шаблоны в заголовочных файлах Обычное решение описанной проблемы заключается в использовании того же подхода, что и для макросов или встраиваемых функций: мы включаем определения шаблона в заголовочный файл, объявляющий этот шаблон.
Исправление rumgot, :
Вандевурд, Дэвид, Джосаттис, Николаи М., Грегор, Дуглас. Шаблоны C++. Справочник разработчика, 2-е изд Глава 9.1.1:
Компилятор C++, вероятно, примет эту программу без каких-либо проблем, но компоновщик, скорее всего, сообщит об ошибке отсутствия определения функции printTypeof(). Причиной этой ошибки является то, что определение шаблона функции printTypeof() не инстанцировано. Чтобы шаблон был инстанцирован, компилятор должен знать, какие определения должны быть инстанцированы и для каких именно аргументов шаблона. К сожалению, в предыдущем примере эти две части информации находятся в файлах, компилируемых по отдельности. Таким образом, когда наш компилятор видит вызов printTypeof (), но не имеет определения шаблона, чтобы инстанцировать его для double, он просто предполагает, что такое определение представлено в другом месте, и создает для этого определения соответствующую ссылку (разрешаемую компоновщиком). С другой стороны, когда компилятор обрабатывает файл myfirst.срр, он не имеет никаких указаний о том, что он должен инстанцировать определение содержащегося в нем шаблона для некоторых конкретных аргументов.
Исходная версия rumgot, :
Вандевурд, Дэвид, Джосаттис, Николаи М., Грегор, Дуглас. Шаблоны C++. Справочник разработчика, 2-е изд Глава 9.1.1:
Компилятор C++, вероятно, примет эту программу без каких-либо проблем, но компоновщик, скорее всего, сообщит об ошибке отсутствия определения функции printTypeof(). Причиной этой ошибки является то, что определение шаблона функции printTypeof() не инстанцировано. Чтобы шаблон был инстанцирован, компилятор должен знать, какие определения должны быть инстанцированы и для каких именно аргументов шаблона. К сожалению, в предыдущем примере эти две части информации находятся в файлах, компилируемых по отдельности. Таким образом, когда наш компилятор видит вызов printTypeof (), но не имеет определения шаблона, чтобы инстанцировать его для double, он просто предполагает, что такое определение представлено в другом месте, и создает для этого определения соответствующую ссылку (разрешаемую компоновщиком). С другой стороны, когда компилятор обрабатывает файл myfirst. срр, он не имеет никаких указаний о том, что он должен инстанцировать определение содержащегося в нем шаблона для некоторых конкретных аргументов.