我创建了一个模板类(ABase),然后将该类扩展(添加了一些额外的功能)到派生类(A)。派生类也是专门的。但是,当我从专门的派生类中引用基类中的成员时,出现链接器错误,即未定义对基类成员的引用。

代码布局如下:

ABase.h:

#include <vector>

namespace A {

template<typename T>
class ABase {
private:
    std::vector<T> items;
public:
    ABase(){};
    void addItem(T item);
};

}

ABase.cpp:
#include "ABase.h"

namespace A {

template<typename T>
void ABase<T>::addItem(T item) {
    items.push_back(item);
}

}

啊:
#include <string>
#include "ABase.h"

namespace A {

class A : public ABase<std::string> {
public:
    void foo(std::string item);
};

}

A.cpp:
namespace A {

void A::foo(std::string item) {
    //do some extra stuff
    ABase::addItem(item);
}
template class ABase<std::string>;
}

main.cpp:
#include <string>
#include "A.h"

using namespace std;

int main() {
    A::A a;
    string item = "hello";
    a.foo(item);
}

我搜索了类似的问题,例如:
  • Undefined reference to partial specialized template class function during link time
  • Undefined reference to member function of template base class

  • 哪个推荐加
    template class ABase<std::string>;
    

    到A.cpp的底部,但是如上所述,我已经尝试过了,但是似乎没有用。我该怎么做才能使其链接。它确实可以编译,但是返回:
    ./src/A.o: In function `A::A::foo(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)':
    /test-proj/Debug/../src/A.cpp:14: undefined reference to `A::ABase<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >::addItem(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)'
    collect2: ld returned 1 exit status
    make: *** [test-proj] Error 1
    

    在链接时。谢谢你的帮助!

    最佳答案

    如果将addItem的实现移动到ABase.h header 中,则应进行编译。像这样:

    #include <vector>
    
    namespace A
    {
        template<typename T>
        class ABase
        {
            private:
                std::vector<T> items;
            public:
                ABase(){};
                void addItem(T item)
                {
                    items.push_back(item);
                };
        };
    }
    

    然后,ABase.cpp文件将变得多余(除非您具有其他方法实现)

    10-07 16:23