C++ 类 Typedef Struct 没有命名类型

Posted

技术标签:

【中文标题】C++ 类 Typedef Struct 没有命名类型【英文标题】:C++ Class Typedef Struct does not name a type 【发布时间】:2012-05-29 14:36:19 【问题描述】:

我正在尝试在我的 C++ 程序中使用 typedef 结构。我开始编写以下代码,直到尝试向我的类添加返回模板 typedef 结构指针的方法时收到错误。

StructSource.h

template <typename T>
class StructSource 
public:
    struct TestStruct
        T value;
    ;
;

用户.h

#include "StructSource.h"

class User 
    public:
        typedef StructSource<int>::TestStruct IntStruct;

        IntStruct *getIntStruct();

;

用户.cpp

#include "User.h"

IntStruct *User::getIntStruct() 
    return 0;

使用 GCC 编译时会出现以下错误。

User.cpp:3:1: 错误:“IntStruct”没有命名类型

我不知道为什么会这样。我缺少什么类型的信息?

【问题讨论】:

在我寻找重复问题时快速回答:使用User::IntStruct 【参考方案1】:

“用户”在这里也是一个“命名空间”(实际上,正如大多数评论者指出的那样,“命名空间”是为了快速回答),所以你必须使用

User::IntStruct *User::getIntStruct() 
    return 0;

【讨论】:

它不是一个命名空间,它是一个作用域。你只需要使用它,因为返回类型不在类范围内,而声明/定义的其余部分在。事实上,即使是后期指定的返回类型 (C++11) 也在类范围内:auto User::getIntStruct() -&gt; IntStruct* return 0; 当然,这就是为什么我用引号将其称为“命名空间”。 “范围”也会与运行时的东西混淆。【参考方案2】:

你需要:

User::IntStruct *User::getIntStruct()  ... 

IntStruct 定义在User 范围内,但函数的返回值不在范围内。讨论了这些范围界定问题here。

【讨论】:

【参考方案3】:

由于IntStruct 是在类中定义的,因此您必须使用类名来引用它,除非在类代码中它是默认名称搜索路径的一部分。

User::IntStruct *User::getIntStruct() 

与命名空间相同,即使语法相同。

【讨论】:

以上是关于C++ 类 Typedef Struct 没有命名类型的主要内容,如果未能解决你的问题,请参考以下文章

(转) struct 和 typedef struct

C++中typedef是啥意思啊

struct和typedef struct区别

typedef struct LNode命名结构指针(线性表的链式存储)

struct和typedef struct彻底明白了

typedef struct 与 struct