声明,然后定义一个类方法 - 为什么会出错?

时间:2017-06-22 07:32:10

标签: c++

为什么不进行编译?

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没有被重载 - 它是完全相同签名的相同函数。

4 个答案:

答案 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() {}

是在类定义中声明函数的两种方法。第一个只声明函数,第二个声明函数并实现它。因此,编译器假定您将重新声明相同的函数并且不是正确的重载,因为函数签名在两者中都是相同的。