C++类别名typedef结构体未命名类型

5

我将尝试在我的C++程序中使用typedef结构。当我编写下面的代码并尝试向类添加返回模板typedef结构指针的方法时,出现了错误。

StructSource.h

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

User.h

#include "StructSource.h"

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

        IntStruct *getIntStruct();

};

User.cpp

#include "User.h"

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

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

User.cpp:3:1: error: ‘IntStruct’ does not name a type

我无法解释为什么会出现这种情况。我缺少哪些类型信息?


4
在我寻找重复问题的同时,给出快速答案:使用User::IntStruct - Xeo
3个回答

11

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

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

1
这不是一个命名空间,而是一个作用域。你只需要使用它,因为返回类型不在类的作用域内,而其余的声明/定义在类的作用域内。事实上,即使是后期指定的返回类型(C++11),也是在类的作用域内:auto User::getIntStruct() -> IntStruct*{ return 0; } - Xeo
1
当然,这就是我在引号中称之为“命名空间”的原因。而“作用域”也会与运行时的东西混淆。 - Viktor Latypov

5
你需要:
User::IntStruct *User::getIntStruct() { ... }

IntStruct在User范围内定义,但函数的返回值不在作用域内。这里讨论了这些作用域问题(链接)


2

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

User::IntStruct *User::getIntStruct() {

尽管语法相同,但这与命名空间不同。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接