为什么不进行编译?
class Test
{
void foo();
void foo()
{ }
};
但这些将编译:
void bar();
void bar()
{ }
// In same header/file
class Test
{
void foo();
};
void Test::foo()
{ }
编译器会说给定方法cannot be overloaded。方法Test::foo
没有被重载 - 它是完全相同签名的相同函数。
答案 0 :(得分:5)
C ++标准明确禁止它。就在[class.mfct/1]
成员函数可以在其类定义中定义,其中 case它是一个内联成员函数,或者它可以在外面定义 它的类定义是否已经声明但未定义 在其类定义中。出现的成员函数定义 类定义之外应出现在命名空间范围内 包含类定义。 除成员函数定义外 出现在类定义之外,除了显式 类模板和成员的成员函数的特化 函数模板([temp.spec])出现在类之外 定义,成员函数不得重新声明。
答案 1 :(得分:1)
这就是它在C ++中的方式。不允许重新声明类成员(除非您将一个类外的定义视为另一个声明)。只要您遵守ODR,就可以重新声明命名空间成员。
答案 2 :(得分:1)
为什么不编译?
class Test {
void foo();
void foo() { }; // wrong
};
因为,正如.Except和其他人回答的那样,您要声明并定义相同的成员函数void Test::foo(void)
两次(以及foo
的内部类定义隐含地inline
)。
如果要在类之后的头文件中定义成员函数,最好将其明确声明为inline
,如下所示:
class Test {
inline void foo();
};
和以后定义该成员函数(例如,在同一个头文件中的下面):
void Test::foo() {
// body of Test::foo
}
顺便说一句,如果你声明一个具有上述外部定义的成员函数,并且该成员函数不是inline
,而是在某些头文件中定义,该文件包含在多个翻译单元中,该函数将被多重定义,链接器会抱怨。
答案 3 :(得分:0)
void foo();
和
void foo() {}
是在类定义中声明函数的两种方法。第一个只声明函数,第二个声明函数并实现它。因此,编译器假定您将重新声明相同的函数并且不是正确的重载,因为函数签名在两者中都是相同的。