模板特化中对基类成员的未定义引用

时间:2015-09-01 13:02:29

标签: c++ inheritance linker specialization

我创建了一个模板类(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);
}

}

A.H:

#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);
}

我搜索过类似的问题,例如:

  1. Undefined reference to partial specialized template class function during link time
  2. Undefined reference to member function of template base class
  3. 建议添加

    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
    

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

1 个答案:

答案 0 :(得分:0)

如果将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);
            };
    };
}

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