gpt4 book ai didi

c++ - 为什么我不能转发声明 typedef?

转载 作者:可可西里 更新时间:2023-11-01 18:10:57 25 4
gpt4 key购买 nike

namespace O
{
class A{};


class A; // ok
typedef A K; // ok

struct A; // ok(C++11): A is a class but for references and pointer it have the same meaning
class K; // (1) error: K is a typedef (of a class...)
}

namespace U
{
typedef O::A A;


class A; // (2) error: A is a typedef (of a class...)
}

标准 C++ 不允许这些情况(1 和 2)编译的原因是什么?

最佳答案

您感到困惑,或者您的示例没有显示您要问的内容。在您的示例代码中,您不是在尝试“转发声明 typedef”(例如不可能或无用,见下文),而是在尝试将现有的 typedef 名称(即一种类型的别名)重新声明为完全不同的类型。

您已经说过 KA 的类型定义,然后您说它是一个类 K。做好决定。它不能同时是 class Aclass K。 (1) 和 (2) 都因同样的原因而失败。

通过示例的这些行:

class A;   // ok
typedef A K; // ok

到目前为止。

struct A;  // ok(C++11): A is a class but for references and pointer it have the same meaning

我不知道你为什么在这里说“C++11”,这在 C++03 中也可以。类和结构在 C++ 中是同一种东西。它们既是“对象类型”,又是“类类型”。对于前向声明,类键(即 structclass)是可以互换的。

class K;   // (1) error: K is a typedef (of a class...)

K 已被声明为类 A 的 typedef,该名称不能重复用于在同一范围内声明新类型。

[旁白:C 确实允许以下内容,因为结构名称和 typedef 名称位于不同的命名空间中:

struct A { };
typedef struct A K; // N.B. need "struct A" not just "A"
struct K { };

但是现在有两种不同的类型,叫做struct KK,它们是不相关的。这样做会令人困惑而且非常愚蠢。]

但从您的评论来看,也许这并不是您实际想要做的事情。

根据您的评论,您的错误示例可能具有误导性,您真正想要做的是:

typedef class A K;   // forward declare A as class and declare K as typedef for it

这为尚未定义的类型声明了一个 typedef。

前向声明一个 typedef 是没有用的,你不能用它做任何事情,因为你不知道它是什么类型 for 的类型,而且几乎没有您可以在不了解类型的情况下使用 C++ 进行操作。在不知道它是对象类型、引用类型还是函数类型的情况下,您实际上可以做的就是为它声明另一个 typedef!

考虑:

typedef K;   // declares K to be a typedef

K* f(); // function returning pointer to K
void g(K*); // function taking pointer to K

我想你是说你希望它有效,那么你希望它起作用吗?

K* k = f();
g(k);

这应该行得通,对吧?您不需要知道 K 的类型,因为您只传递指向它的指针,对吧?错误的。如果您稍后像这样定义 K 会怎样:

typedef int& K;

现在 f 的签名 int&* f() 是无效的。您必须知道什么是 typedef for 的 typedef,因此它的声明必须说明它是什么,而不仅仅是向前声明它作为名称。

关于c++ - 为什么我不能转发声明 typedef?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14444291/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com