0

当我有相同的排序算法时,怎么会这样

bool Sorter(const Object* n1, const Object* n2) { return (n1->GetValue() < n2->GetValue()); }

在单独的 .cpp 文件中,链接器(我相信)给了我一个多重定义的符号 - 错误?当我重命名它们(Sorter1、Sorter2、..)时,它会编译。这些类继承自同一个父类,但父类中没有算法内容。我只是没有意识到为什么当班级之间没有直接联系并且很好奇时这会变成一个错误。

另外,是否有任何直接的方法可以从父类中引用分拣机,还是我只需要创建一个使用分拣机的函数?

4

4 回答 4

3

默认情况下,函数具有外部链接,这意味着任何具有函数声明的源文件都可以使用它,无论哪个文件具有定义。链接器负责连接不同的用途,这就是为什么它在找到多个用途时会报错。

要使函数对包含在其中的源文件保持私有,您必须static在其上使用关键字或将其放在未命名的命名空间中。

如果所有函数定义都相同,您可以使用inline关键字向链接器指示它们相同,但在这种情况下,您应该将函数放入头文件中以确保完全安全。

于 2012-09-10T21:19:30.430 回答
1

试着把它写成

static bool Sorter(const Object* n1, const Object* n2) { 
  return (n1->GetValue() < n2->GetValue()); 
}

或者

namespace { 
  Sorter(const Object* n1, const Object* n2) {  
     return (n1->GetValue() < n2->GetValue()); 
  }
}

这应该给它你正在寻找的 per-cpp 范围。

如果您在头文件中编写函数,请使用

inline bool Sorter(const Object* n1, const Object* n2) { 
  return (n1->GetValue() < n2->GetValue()); 
}
于 2012-09-10T20:54:32.020 回答
0

这些似乎是免费功能,而不是类的成员。要定义一个类成员,您需要bool Class1::Sorter( blah ) { foo; }并且bool Class2::Sorter(blah) { foo; }

于 2012-09-10T20:39:04.677 回答
-1

Sorter 是一个全局函数——不是类或从类实例化的对象。如果在两个编译单元中声明了相同的全局函数,则会出现链接错误。

于 2012-09-10T20:39:56.860 回答