C++ 为什么在C++;在标头中定义成员函数而不是自由函数?

C++ 为什么在C++;在标头中定义成员函数而不是自由函数?,c++,C++,假设我有三个文件A.cpp,B.cpp,和B.hA.cpp和B.cpp都包括B.h。我在B.h中定义了一个自由函数(无论出于何种原因)。然后我得到一个链接器错误: ld:架构x86_64的1个重复符号 这是有道理的。编译器分别编译A.cpp和B.cpp,因此有两个具有相同名称和参数的函数 但是,如果我在B.h中声明了一个类,并在这个类中定义了一个成员函数,它就可以正常编译。为什么呢?这不应该产生相同的链接器错误吗 为什么C++在一个报头中定义一个成员函数,而不是一个自由函数? 多次定义非内联函数

假设我有三个文件
A.cpp
B.cpp
,和
B.h
A.cpp
B.cpp
都包括
B.h
。我在
B.h
中定义了一个自由函数(无论出于何种原因)。然后我得到一个链接器错误:

ld:架构x86_64的1个重复符号

这是有道理的。编译器分别编译
A.cpp
B.cpp
,因此有两个具有相同名称和参数的函数

但是,如果我在
B.h
中声明了一个类,并在这个类中定义了一个成员函数,它就可以正常编译。为什么呢?这不应该产生相同的链接器错误吗

为什么C++在一个报头中定义一个成员函数,而不是一个自由函数? 多次定义非内联函数是不合适的。这是“一个定义规则”的一部分

可以在多个翻译单元中定义内联函数。事实上,内联函数必须在使用它们的每个翻译单元中定义

头文件通常包含在多个翻译单元中。因此,头中定义的所有函数都应该是内联函数


在类定义中定义的成员函数是隐式内联的。作为内联函数,可以在头中定义它们,就像在头中定义内联非成员函数一样。同样,在头中定义非内联成员函数也不可以,就像在头中定义非内联非成员函数一样。

这是否回答了您的问题?我不是链接方面的专家,但答案可能很简单,因为成员函数是隐式
内联的
。尝试将
inline
添加到您的免费函数中,然后查看。