为什么我有相同的排序算法呢?
bool Sorter(const Object* n1, const Object* n2) { return (n1->GetValue() < n2->GetValue()); }
在单独的.cpp文件中,链接器(我相信)给了我一个多重定义的符号-error? 当我重命名它们(Sorter1,Sorter2,..)时,它会编译。这些类继承自同一个父类,但父类没有算法内容。我只是没有意识到为什么当课程没有直接接触并且很好奇时,这会成为一个错误。
另外,有没有直接引用分类器的方法,比如说,父类,或者我只需要创建一个使用分类器的函数?
答案 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是一个全局函数 - 不是从类中实例化的类或对象。如果在两个编译单元中声明了相同的全局函数,则会出现链接错误。