c++ - 模板特化中对基类成员的 undefined reference

标签 c++ inheritance linker specialization

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

代码布局如下:

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

主要.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

哪个推荐加

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 文件将变得多余(除非您有其他方法实现)

关于c++ - 模板特化中对基类成员的 undefined reference ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32332415/

相关文章:

c++ - Fork Direct Show 三通过滤器

c++ - 一个编译单元中的静态初始化

Java 继承 - sibling 的重写方法问题

c++ - 使用我的程序分发共享对象

c++ - 为什么 hash<const char*> 适用于字符串而不适用于字符串变量?

c++ - 如何在不递增(递减)迭代器的情况下获取 std::list 中的下一个(上一个)元素?

objective-c - 使用父类(super class)初始化器初始化一个类

c++ - 继承方法,派生方法不调用基类

c++ - Linux,静态库引用可执行文件中的其他静态库

c++ - Visual Studio 2012 - 两个项目 -> 链接器错误 (C++)