Переопределение шаблонной специализации - PullRequest
1 голос
/ 06 апреля 2019

Я искал решение для своей проблемы, но не смог его найти :( Итак, у меня есть шаблон: template < int N > class ListOfPolyomines и его специализация для N = 1. Файл listofpolyomines.h включен в основной файли все работает нормально. Но когда я включил listofpolyomines.h в shell.h (который имеет реализацию в shell.cpp) и shell.h в main.cpp, то это ошибка переопределения.

У меня естьпопытался скомпилировать его без shell.cpp (реализация только в shell.h), и он тоже работал нормально. Я попытался также скомпилировать его без spezialization, но с shell.cpp, и он тоже работал. Таким образом, шаблон spezalization и файлПроблема заключается в shell.cpp. В каждой библиотеке, конечно, #ifndef #define #endif. И shell - это не шаблон, а обычный класс.

Это мой шаблон и специализация его метода:

template <int N>
class ListOfPolyminoes {
    public:
        ListOfPolyminoes();
        ~ListOfPolyminoes();
        void printPoly();
        ...

    private:
        bool ifPolyExist(Polyminoe<N> temp);
        std::vector< Polyminoe<N> > NPoly;
        void generatePoly(Polyminoe<N-1> poly);
};

template <>
ListOfPolyminoes<1>::ListOfPolyminoes(){
    NPoly.push_back(Polyminoe<1>());
}


// Polyminoe - это другой шаблон. ListOfPolymiones имеет вектор Polyminoe

Это ошибка:

In function `__gnu_cxx::new_allocator<Polyminoe<1> >::~new_allocator()': ...`
`[349] multiple definition of ListOfPolyminoes<1>::ListOfPolyminoes()' ...`
`[49] first defined here`

Было бы очень хорошо, если бы кто-то сказал мнечто я делаю не так и как избежать этого переопределения :) Заранее спасибо!

1 Ответ

0 голосов
/ 06 апреля 2019
template <>
inline ListOfPolyminoes<1>::ListOfPolyminoes(){
    NPoly.push_back(Polyminoe<1>());
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...