Не может экспортировать функцию шаблона

У меня есть класс под названием «SimObject»:

namespace simBase
{
    class __declspec(dllexport) SimObject: public SimSomething
    {
        public:

            template <class T>
            void updateParamValue( const std::string& name, T val );
    }
}

У меня есть другой класс под названием «ITerrainDrawable»:

namespace simTerrain
{
    class __declspec(dllexport) ITerrainDrawable : public simBase::SimObject
    {
    }
}

Эти классы находятся в различных библиотеках. SimObject находится в simBase, ITerrainDrawable находится в simTerrain библиотеках. Даже если ITerrainDrawable получен из SimObject, и я включал библиотеку simBase, я получаю ошибку связи:

нерешенный внешний символ

1>ITerrainDrawable.obj : error LNK2019: unresolved external symbol "public: void __thiscall simBase::SimObject::updateParamValue<float>(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,float)" (??$updateParamValue@M@SimObject@simBase@@QAEXABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@M@Z) referenced in function "public: void __thiscall simTerrain::ITerrainDrawable::setTerrainSize(float)" (?setTerrainSize@ITerrainDrawable@simTerrain@@QAEXM@Z)
1>ITerrainDrawable.obj : error LNK2019: unresolved external symbol "public: void __thiscall simBase::SimObject::updateParamValue<class osg::Vec4f>(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,class osg::Vec4f)" (??$updateParamValue@VVec4f@osg@@@SimObject@simBase@@QAEXABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@VVec4f@osg@@@Z) referenced in function "public: void __thiscall simTerrain::ITerrainDrawable::setSatelliteTextureBorders(class osg::Vec2f,class osg::Vec2f)" (?setSatelliteTextureBorders@ITerrainDrawable@simTerrain@@QAEXVVec2f@osg@@0@Z)

Почему я получаю эту ошибку?

Все хорошо работает, если я не использую функцию шаблона, но мне нужна она.

Если я перемещаю эту функцию в simTerrain библиотеку, она хорошо работает, но я не хочу использовать двойную функцию, потому что есть многие библиотеки как simTerrain.

8
задан Peter Mortensen 28 December 2009 в 21:46
поделиться

3 ответа

C++ на самом деле не поддерживает отдельную компиляцию шаблонного кода - нужно поместить определение шаблона в заголовочный файл.

.
12
ответ дан 5 December 2019 в 05:34
поделиться

Полная реализация класса шаблона должна быть в заголовке этого класса шаблона. Стандарты ANSI/ISO для C++ позволяют поместить реализацию в отдельный модуль компиляции, используя ключевое слово export, но в настоящее время существуют компиляторы, которые реально это поддерживают.

За более подробной информацией обращайтесь к this и this.

5
ответ дан 5 December 2019 в 05:34
поделиться

Для шаблонов существует две модели компиляции :

  1. Включенная модель компиляции ( как и включающий заголовочный файл )
  2. Отдельная модель компиляции ( отделение интерфейса от реализации )

Вы можете использовать экспорт ключевого слова во время определения шаблона для 2-ой опции.

export template <class T>
void updateParamValue( const std::string& name, T val ) {}

Но я не уверен, что все компиляторы поддерживают ее.

6
ответ дан 5 December 2019 в 05:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: