声明和带有定义的声明.为什么不允许这样做
Declaration and declaration with definition. Why is this not allowed?
我想知道,为什么不允许写:
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()'.
相关文章:
- 为什么在定义函数之前先声明它
- 为什么我不能在一个类的不同行中声明和定义成员变量?
- 我不明白为什么我声明一个空的内部结构并将其传递给构造函数
- 当我在main中声明了我的2d数组时,为什么我的程序会退出
- 为什么我必须在C++中添加一个赋值符号来声明一个数组
- 为什么C++编译器没有检测到正确声明的类?
- 包含的类类型显然没有声明,为什么?
- 为什么我必须以这种方式声明指针?
- 为什么我们将单个或多维数组的大小声明为常量值?
- 为什么函数声明中允许 const?
- 如果 x.h 仅由函数声明组成,为什么有必要在 x 中包含 x.h.cpp
- 为什么即使我声明了朋友类,我也会收到错误"无法访问类中声明的私人成员"
- 为什么 C++ 中的以下结构声明会导致退出 127?
- 为什么在我的 main 函数中声明整数后我的整数数组中会出现错误?
- 为什么转换函数声明不需要至少一个定义类型说明符
- 我无法正确获取这些变量声明...为什么这些参数不起作用?我只是将 n 值设置为数组长度
- 默认参数声明:为什么默认字符串参数必须是 const
- 声明和带有定义的声明.为什么不允许这样做
- 类作为模板参数的前向声明.为什么会这样呢?
- 语法错误:需要声明.为什么gsoap不能读取vector