Переопределение специализации шаблона

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

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

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

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`

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


person aylan    schedule 05.04.2019    source источник


Ответы (1)


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

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

person bipll    schedule 05.04.2019