C++ 模板专门化中对基类成员的未定义引用

C++ 模板专门化中对基类成员的未定义引用,c++,inheritance,linker,specialization,C++,Inheritance,Linker,Specialization,我创建了一个模板类(ABase),然后将该类(添加一些额外的功能)扩展到一个派生类(a)。派生类也是专用的。但是,当我在专用派生类中引用基类中的成员时,我得到一个链接器错误,即存在对基类成员的未定义引用 代码布局如下所示: A.h: #include <vector> namespace A { template<typename T> class ABase { private: std::vector<T> items; public:

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

代码布局如下所示:

A.h:

#include <vector>

namespace A {

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

}
#包括
名称空间A{
模板
等级降级{
私人:
向量项;
公众:
ABase(){};
无效附加项(T项);
};
}
ABase.cpp:

#include "ABase.h"

namespace A {

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

}
#包括“ABase.h”
名称空间A{
模板
无效基础::附加项(T项){
项目。推回(项目);
}
}
A.h:

#包括
#包括“ABase.h”
名称空间A{
甲级:公开募捐{
公众:
void foo(标准::字符串项);
};
}
A.cpp:

namespace A {

void A::foo(std::string item) {
    //do some extra stuff
    ABase::addItem(item);
}
template class ABase<std::string>;
}
名称空间A{
void A::foo(std::string项){
//做一些额外的事情
ABase::附加项(项目);
}
模板类数据库;
}
main.cpp:

#include <string>
#include "A.h"

using namespace std;

int main() {
    A::A a;
    string item = "hello";
    a.foo(item);
}
#包括
#包括“A.h”
使用名称空间std;
int main(){
A::A;
string item=“hello”;
a、 foo(项目),;
}
我搜索过类似的问题,例如:

  • 哪一个建议添加

    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
    
    /src/A.o:在函数'A::A::foo(std::basic_string)'中:
    /testproj/Debug/。/src/A.cpp:14:对“A::ABase::addItem(std::basic_string)”的未定义引用
    collect2:ld返回了1个退出状态
    make:**[测试项目]错误1
    

    当它链接时。谢谢你的帮助

    如果将addItem的实现移动到ABase.h头中,则应该编译它。大概是这样的:

    #include <vector>
    
    namespace A 
    {
        template<typename T>
        class ABase 
        {
            private:
                std::vector<T> items;
            public:
                ABase(){};
                void addItem(T item)
                {
                    items.push_back(item);
                };
        };
    }
    
    #包括
    名称空间A
    {
    模板
    等级降级
    {
    私人:
    向量项;
    公众:
    ABase(){};
    无效附加项(T项)
    {
    项目。推回(项目);
    };
    };
    }
    

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

    这很好,但我宁愿将实现与头分开。有没有什么方法可以解决这个问题,并且不让实现出现在标题中?
    #include <vector>
    
    namespace A 
    {
        template<typename T>
        class ABase 
        {
            private:
                std::vector<T> items;
            public:
                ABase(){};
                void addItem(T item)
                {
                    items.push_back(item);
                };
        };
    }