分拣机名称在单独的.cpp文件中冲突

时间:2012-09-10 20:31:53

标签: c++ sorting

为什么我有相同的排序算法呢?

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

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

另外,有没有直接引用分类器的方法,比如说,父类,或者我只需要创建一个使用分类器的函数?

4 个答案:

答案 0 :(得分:3)

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

要将函数保密为源文件,您必须在其上使用static关键字或将其放在unnamed namespace中。

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

答案 1 :(得分: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()); 
  }
}

这应该给它你正在寻找的每个cpp范围。

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:-1)

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