【问题标题】:"undefined reference to" linker error while working with templates [duplicate]使用模板时出现“未定义的引用”链接器错误[重复]
【发布时间】:2016-03-31 11:49:27
【问题描述】:

我有一个类数组

template <typename T>
class Array : public SequentialContainer<T>{
public:
    Array(Int size){local_vector.reserve(size);}
    Array(std::initializer_list<T> initializer_list){
        local_vector.assign(initializer_list);
    }
    virtual Boolean contains(T &object) const;
    virtual Boolean contains(Container<T> &container) const;
    virtual Int size() const;
    virtual T &operator[](Int idx);
    virtual T &get(Int idx);
    virtual void set(Int idx, const T &object);
    virtual Int indexOf(T &object);
    virtual Iterator<T> iterator() const;
};

Array.cpp文件中的所有方法都是这样实现的:

template <typename T>
Boolean Array<T>::contains(T &object) const {
//code
}

如果我尝试在 main.cpp 文件中使用这个 Array 类:

Array<int> c = {1, 2, 3, 4, 5, 6};
std::cout << c.[4] <<std::endl;

我收到这些链接器错误:

undefined reference to `Array<int>::iterator() const'
undefined reference to `Array<int>::contains(int&) const'
undefined reference to `Array<int>::contains(Container<int>&) const'
etc...

对于 Array 类的每个方法。所有文件都在我的 cmake 文件中,应该编译。 为什么我收到此链接器错误?有人可以解释一下吗?

【问题讨论】:

  • Array.cpp 您必须将所有模板定义放在标题中。模板不像普通类那样工作......
  • "Array.cpp文件中所有的方法都是这样实现的:"哎呀

标签: c++ c++11 compilation linker


【解决方案1】:

您不能在 cpp 文件中实现模板方法或类。尝试在标题中执行此操作

【讨论】:

  • 其实可以的。但是它们只能以有限的方式使用,并且需要进行少量的额外工作。
猜你喜欢
  • 1970-01-01
  • 2016-12-10
  • 1970-01-01
  • 2013-01-11
  • 1970-01-01
  • 2019-11-25
  • 2019-07-03
  • 2014-01-19
  • 1970-01-01
相关资源
最近更新 更多