我想知道,为什么不允许这样写:
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;,但我只是想知道,为什么以上是错的。
答案 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()'.