代码之家  ›  专栏  ›  技术社区  ›  463035818_is_not_an_ai

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

  •  5
  • 463035818_is_not_an_ai  · 技术社区  · 10 年前

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

    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:我知道如何写“正确的方式”,但我只是想知道,为什么上面的内容是错误的。

    2 回复  |  直到 10 年前
        1
  •  10
  •   Richard Hodges    10 年前

    来自§9.3

    除了出现的成员函数定义 在类定义之外,并且类模板的成员函数的显式专门化除外 以及出现在类定义之外的成员函数模板(14.7), 成员职能不得 重新申报 .

    此外,在这种情况下,声明也可能违反:

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

    由于第一个声明没有将函数声明为 inline 第二个定义隐含地这样做。

    然而,这一反思似乎没有那么令人信服。

        2
  •  5
  •   DevSolar    10 年前

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

    这与是否第二次定义函数无关。关键是你是 声明 函数两次,即 好啊

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

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

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

    'void foo::bar()' cannot be overloaded with 'void foo::bar()'.
    
    推荐文章