gpt4 book ai didi

c++ - 本地类的限定名称

转载 作者:行者123 更新时间:2023-12-01 14:30:37 25 4
gpt4 key购买 nike

typename声明中的关键字在其后需要一个限定类型名称(一个在其前面带有嵌套名称分隔符的类型名称)。但是什么是本地类或结构的限定名称?这是示例:

struct A{};
namespace bb { struct B{}; }
int main()
{
struct C{};

typename A a; // not OK, because A is not a qualified typename
typename ::A a; // OK, because it contains a nested name specifier
typename B b; // not OK, because B is not a qualified typename
typename bb::B b; // OK, because it contains a nested name specifier
typename C c; // not OK in gcc and clang but compiles in Visual Studio
}

这是我从 clang 得到的错误:expected a qualified name after 'typename'

这是gcc报错:<source>:21:14: error: expected nested-name-specifier before 'C'

是否可以在typename 之后使用本地类名? ?如果是这样,那么它的限定名称是什么?该类报告为 main()::C在 clang 错误消息中,但这显然不是它的限定名称。我在 C++ 标准中找不到禁止在这种情况下使用本地类的地方。我错过了什么吗? Visual Studio 没有提示 typename C c;那么这是 gcc 和 clang 中的错误吗?

附言。我知道如果我不使用模板,我可以在变量前面声明没有类型名的变量,但我只是想知道这是语言中的错误、gcc/clang 或 Visual Studio 中的错误,还是我遗漏了什么。

最佳答案

gcc 和 clang 听起来更严格和正确,而 VS 更宽松(不确定是否属于错误)。

正如您已经正确编写的那样,typename 需要一个限定名称。那是“出现在范围解析运算符 :: 右侧的名称”。无法将 :: 与本地类一起使用,这意味着没有 :: 限定的名称(因此,如上面引用的定义所示)。这样的要求是否具有良好的逻辑,后人可能会决定,但对于什么是有值(value)的,以下内容确实有效:

int main()
{
struct C { public: struct D{}; };

typename C::D d; // ok

return 0;
}

另外可能值得一提的是,从 c++11 开始,允许在模板外使用 typename,以防使用较旧的编译器。

关于c++ - 本地类的限定名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61768341/

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