явная реализация шаблона функции не удалась (g ++) - PullRequest
4 голосов
/ 06 декабря 2010

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

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

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

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

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

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

РЕДАКТИРОВАТЬ: так как проблема не легко (или вообще) воспроизводима, я думаю, будет трудно получить ответ.Я буду обновлять, если у меня есть какие-либо новые идеи.

Ответы [ 2 ]

4 голосов
/ 21 января 2014

У меня была похожая проблема.Решил это путем перемещения экземпляра после реализации в .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>;
0 голосов
/ 28 апреля 2011

Цитата из www.cplusplus.com

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

...