2010-12-06 3 views
3

У меня возникают некоторые проблемы (например, ошибки привязки) с явным экземпляром шаблона функции. В Visual Studio проект подключается нормально, только под g ++/Unix, используя Eclipse-CDT, связь создает ошибки.явное создание шаблона функции не работает (g ++)

Вызов функции является частью статической библиотеки, которая связана с динамической библиотекой в ​​большом проекте. Архитектура функции выглядит следующим образом: Шаблон

  • функция объявлена ​​(но не реализовано) внутри пространства имен в моем MathUtils.h файле. Одним из аргументов функции является сам шаблон структуры, который объявлен и, реализованный в этом файле h (в том же пространстве имен).
  • Функция реализации и создания экземпляра находится в MathUtils.cpp.
  • вызов функции находится в someFile.cpp (который, конечно, #include "MathUtils.h"), который скомпилирован & связан как часть статической библиотеки.

То, что сводит меня (почти) с умом, то, что ошибки сборки не полностью воспроизводимые, и я подозреваю, что затмение является быть обвинено (может пропустить некоторые шаги, хотя я использую clean project перед каждой сборкой).

Примерно через час конфигурация отладки построена без ошибок, но сбой версии с ошибкой связи undefined reference to.... Затем в течение следующего часа обе конфигурации не удались. Затем я сделал небольшой проект с тремя файлами, упомянутыми выше, и скомпилировал его как из командной строки, так и из Eclipse - никаких ошибок вообще. Теперь обе конфигурации, похоже, подключены нормально.

У кого-нибудь возникли подобные проблемы с использованием Eclipse-CDT? Какие-либо предложения?

EDIT: поскольку проблема не является легко (или вообще) воспроизводимой, я думаю, будет сложно получить ответ. Я обновлю, если у меня появятся новые идеи.

ответ

-2

Цитируя www.cplusplus.com

Поскольку шаблоны компилируются при необходимости, это заставляет ограничение для нескольких файлов
проектов: реализация (определение) шаблонного класса или функции должны быть в том же файл как его декларации. Это означает, что мы не можем отделить интерфейс в отдельном файле заголовка и что мы должны включать как интерфейс, так и реализацию в любом файле, который использует шаблоны.

+3

Это не так, обратите внимание на `явном instantiation`. – 2011-04-28 06:38:18

+0

Моя ошибка - я неправильно использую шаблоны функций для шаблонов классов. – stackmate 2011-04-29 18:24:27

3

У меня была аналогичная проблема. Решил его, переместив экземпляр после реализации в .cpp с реализацией класса.

myclass.hpp:

template <class T> 
class MyClass 
{ 
public: 
    MyClass(); 
    // other declarations 
}; 

myclass.cpp:

#include "myclass.hpp" 

template <class T> 
MyClass<T>::MyClass() 
{ 
} 

template class MyClass<int>; 
template class MyClass<bool>;