未定义的引用

undefined reference

本文关键字:引用 未定义      更新时间:2023-10-16

我有这些类(和函数):

template <class A>
class Factory{
  public:
    A (*binOp(void))(A,A);
};
int sum(int a, int b){
  return a + b;
}
class IntFactory : public Factory<int>{
  public:
    int (*binOp(void))(int,int){
      return &sum;
    }
};
template <class A>
class SpecializedList{
  protected:
    List<A>* list;
    Factory<A>* factory;
  public:
    SpecializedList(List<A>* list,Factory<A>* factory){
      this -> list = list;
      this -> factory = factory;
    }
    A sum(){
      return (list -> foldLeft(factory -> zero(), factory -> binOp()));
    }
};
// in main
SpecializedList<int>* sl = new SpecializedList<int>(join1 -> getList(),new IntFactory());
cout << sl -> sum() << endl;

我收到错误:

/tmp/ccxdiwUF.o: In function SpecializedList<int>::sum()':
list.cpp:(.text._ZN15SpecializedListIiE3sumEv[SpecializedList<int>::sum()]+0x19): undefined reference to工厂::binOp()'list.cpp:(.text._ZN15SpecializedListIiE3sumEv[SpecializedList::sum()]+0x2c):`Factory::zero()'collect2:ld返回1退出状态有人知道为什么吗?我在谷歌上搜索错误消息的相关部分,当代码分散在不同的文件中时,它看起来与问题有关。我现在把所有东西都放在一个文件里。

两个问题:

  • 工厂没有定义函数binOp()
  • 工厂甚至没有功能zero()

解决方案:

  • 通过将纯说明符指定为:,使函数binOp()成为Factory中的纯虚拟函数

     virtual A (*binOp(void))(A,A) = 0; //"=0" is called pure-specifier
    //^^^^^^ this makes the function virtual
    

    现在不需要来定义它(就链接器错误而言)。您也可以选择定义它。

  • 在Factory中声明一个函数zero()。如果你不让它成为纯虚拟的,那么就必须定义它