【问题标题】:Ctor not allowed return type不允许返回类型
【发布时间】:2010-04-05 16:57:35
【问题描述】:

有代码:

struct B
{
    int* a;
    B(int value):a(new int(value))
    {   }
    B():a(nullptr){}
    B(const B&);
}

B::B(const B& pattern)
{

}

我收到错误消息:
'错误 1 ​​错误 C2533: 'B::{ctor}' : 构造函数不允许返回类型'

知道为什么吗?
附言我正在使用 VS 2010RC

【问题讨论】:

  • 啊,结构/类末尾的可怕分号。
  • 不幸的是,您在 Visual Studio 2019 (cl.exe v19.26.28806) 中遇到了同样无用的错误。来自 MSVC 编译器的提示会很好。显然gcc 编译器已经这样做了。我只是通过将另一个整个工人阶级复制到失败的.h.cpp 中才发现我的错误。在慢慢剥离功能、重建、重复之后,我最终得到了一个可以工作的简单版本……然后我发现了丢失的分号。啊!

标签: c++ constructor


【解决方案1】:

struct 定义后缺少分号。


错误是正确的,构造函数没有返回类型。因为您缺少分号,所以整个结构定义被视为函数的返回类型,如下所示:

// vvv return type vvv
struct { /* stuff */ } foo(void)
{
}

添加分号:

struct B
{
    int* a;
    B(int value):a(new int(value))
    {   }
    B():a(nullptr){}
    B(const B&);
}; // end class definition

// ah, no return type
B::B(const B& pattern)
{

}

【讨论】:

  • 谢谢。顺便说一句,有人知道在 c++0x 中不需要那个愚蠢的分号吗?当您考虑这一点时,它与 c++ 中的其他构造有些不一致。还是我错过了什么?
  • 有点c的宿醉,struct的声明就是类型的定义,类的声明看起来像一个struct。 ps VS2010 会警告你!
  • @Martin:这不仅仅是 C 的“宿醉”。类似:class { /* ...*/ } object; 是允许的,所以 需要 分号来告诉编译器它已经结束类定义。
【解决方案2】:

你需要一个更好的编译器。使用 g++:

a.cpp:1: error: new types may not be defined in a return type
a.cpp:1: note: (perhaps a semicolon is missing after the definition of 'B')
a.cpp:5: error: return type specification for constructor invalid

分号是必需的,因为它终止了可能的结构实例列表:

struct B {
...
} x, y, z;

创建 B 的三个实例,称为 x、y 和 z。这是 C++ 的 C 遗产的一部分,在 C++0x 中仍然存在。

【讨论】:

  • +1 表示答案,-1 表示理由。相对容易实现(对于专业人士),如果括号后没有任何内容,那就是声明的结尾。
  • @atch 你现在是解析 C++ 的专家了吗?关键是在结构之后有 的东西 - 你的构造函数。
  • @atch:你写过编译器吗?
  • @GMan 甚至只是一个解析器。创建看起来正确但存在细微问题的模棱两可的语法真的很容易。
  • @atch:既然你问“有多少人使用过这个”(意思是类型定义后的声明符,我查看了公共 Windows 头文件(实际上是windef.h 和 winbase.h)和找不到没有声明符的单个实例。有时它是 typedef(或四个,用于指针变体),有时它是嵌套结构的名称,但每个结构声明都使用声明符。跨度>
猜你喜欢
  • 2021-12-15
  • 2019-08-03
  • 2011-10-25
  • 2016-05-18
  • 2016-12-06
  • 2020-05-26
  • 1970-01-01
  • 1970-01-01
  • 2018-10-13
相关资源
最近更新 更多