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

时间:2016-01-25 09:58:44

标签: c++ overloading language-lawyer declaration definition

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

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

该函数被声明两次(我认为这没问题)并定义了一次。但是,我的编译器抱怨:

decldef.cxx:7:10: error: 'void foo::bar()' cannot be overloaded

为什么不允许?

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

PS:我知道如何写它&#34;正确的方式&#34;,但我只是想知道,为什么以上是错的。

2 个答案:

答案 0 :(得分:10)

来自§9.3

  

除了出现的成员函数定义   在类定义之外,并且除了类模板的成员函数的显式特化之外   和成员函数模板(14.7)出现在类定义之外,成员函数不得   被重新宣布

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

  

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

由于第一个声明未将函数声明为inline。第二个定义隐含着。

然而,反思的那个似乎不太有说服力。

答案 1 :(得分:5)

  

该函数被声明两次(我认为这没问题)并定义了一次。

这与您是否第二次定义函数无关。关键是你声明该函数两次,那就是 OK。

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

struct foo {
    void bar();
    void bar();
};

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

'void foo::bar()' cannot be overloaded with 'void foo::bar()'.