重新定义模板专业化

时间:2019-04-05 23:11:11

标签: class c++11 templates redefinition

我一直在寻找解决问题的方法,但是我找不到它:( 因此,我有一个模板: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 :(得分:0)

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

应该有帮助。 您无需显式inline来获取包含链接标头的每个文件中公开链接的函数。