声明和声明的定义.为什么不允许这样做?

for*_*818 5 c++ overloading declaration definition language-lawyer

我想知道,为什么不允许这样写:

struct foo {      
    void bar();                                     // declaration
    void bar(){std::cout << "moo" << std::endl;}    // declaration + definition
};
Run Code Online (Sandbox Code Playgroud)

该函数被声明两次(我认为这是可以的)并定义一次.但是,我的编译器抱怨:

decldef.cxx:7:10: error: 'void foo::bar()' cannot be overloaded
Run Code Online (Sandbox Code Playgroud)

为什么不允许?

为什么我的编译器(g ++ 4.7.2)将此解释为重载?

PS:我知道怎么写"正确的方式",但我只是想知道,为什么上面的错误.

Ric*_*ges 10

从§9.3开始

除了出现在类定义之外的成员函数定义之外,除了出现在类定义之外的类模板和成员函数模板(14.7)的成员函数的显式特化之外,不应重新声明成员函数.

此外,在这种情况下,陈述也可能违反:

可以在其类定义中定义成员函数(8.4),在这种情况下,它是内联成员函数 (7.1.2),或者如果它已经被声明但未在其定义中定义,则可以在其类定义之外定义它.类定义.

由于第一个声明没有声明函数inline.第二个定义隐含着.

然而,反思的那个似乎不那么有说服力.

  • 你引用的第二部分是真正回答问题的内容; "_a成员函数不得重新声明_".在这种情况下,内联差异并不重要. (4认同)
  • 如果这是正确的答案,为什么`struct foo {void bar(); void bar(); `失败并显示相同的错误消息? (3认同)

Dev*_*lar 5

该函数被声明两次(我认为这是可以的)并定义一次.

这与您是否第二次定义函数无关.问题的关键是,你声明函数两次,这是正常.

这也没有编译,具有相同的错误消息:

struct foo {
    void bar();
    void bar();
};
Run Code Online (Sandbox Code Playgroud)

您不能在类定义中使用相同的参数列表重新声明相同的函数:

'void foo::bar()' cannot be overloaded with 'void foo::bar()'.
Run Code Online (Sandbox Code Playgroud)