0

为什么这段代码会给我一个链接器错误,我该如何解决?

架构 x86_64 的未定义符号:“operator==(foo const&, foo const&)”,引用自:main.o ld 中的 _main:未找到架构 x86_64 的符号

template<typename T>
class foo {
  //friends get access to the private member t
  friend bool operator==(const foo<T> &lhs, const foo<T> &rhs);
  T t;
};

template<typename T>
bool operator==(const foo<T> &lhs, const foo<T> &rhs) {
  return lhs.t == rhs.t;
}

int main(int,char**) {
  foo<int> f1, f2;
  if (f1 == f2)
    ;
  return 0;
}
4

4 回答 4

3

这是您的代码的修复:

template<typename T>
class foo; // Forward declaration

template<typename T> // Need to define or declare this before the class
bool operator==(const foo<T> &lhs, const foo<T> &rhs) {
  return lhs.t == rhs.t; 
}

template<typename T>
class foo {
  // Notice the little <> here denoting a specialization
  friend bool operator==<>(const foo<T> &lhs, const foo<T> &rhs);
  T t;
};
于 2013-06-10T12:31:02.180 回答
1

operator==是一个函数模板,但友谊声明并没有反映这一点。这是修复它的一种方法:

template <class U>
friend bool operator==(const foo<U> &lhs, const foo<U> &rhs);

一个非常小的故障是它允许operator==<int>朋友访问foo<string>. 出于这个原因,我认为@JesseGood 的修复更简洁,尽管(自相矛盾地)更冗长。

于 2013-06-10T12:31:15.970 回答
0

您需要再次指定模板类型,但与类模板类型不同:

template<typename V>
friend bool operator==(const foo<V> &lhs, const foo<V> &rhs);
于 2013-06-10T12:31:57.777 回答
-2

重载运算符时,避免使用友元函数;您需要将您的函数定义为公共类成员,并使其仅接受一个参数(而不是两个)。

template<typename T>
class foo {
  //public function allowing access to the private member t
  public:
  bool operator==(  foo<T> &rhs)
  {
      return t == rhs.t;
  }
  private:
  T t;
};


int main(int,char**) {
  foo<int> f1, f2;
  if (f1 == f2)
    ;
  return 0;
}
于 2013-06-10T12:29:10.407 回答