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

Declaration and declaration with definition. Why is this not allowed?

本文关键字:声明 为什么 不允许 这样做 定义      更新时间:2023-10-16

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

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:我知道如何"正确"地写它,但我只是想知道,为什么上面是错误的。

来自 §9.3

显示的成员函数定义除外 在类定义之外,并且类模板的成员函数的显式专用化除外 和出现在类定义之外的成员函数模板 (14.7),成员函数不得 被重新声明

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

成员函数

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

由于第一个声明没有声明要inline的函数。第二个定义隐含地做到了。

然而,反思一下似乎不太令人信服。

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

这与是否第二次定义函数无关。关键是你声明了两次函数,这是行的。

这也不会编译,并显示相同的错误消息:

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

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

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