在类中使用声明是指 'std::',它不是类 [duplicate]

Using declaration in class refers into 'std::', which is not a class [duplicate]

提问人:KcFnMi 提问时间:2/11/2023 最后编辑:Vlad from MoscowKcFnMi 更新时间:2/11/2023 访问量:306

问:

我试图忘记,考虑 https://www.youtube.com/watch?v=MZqjl9HEPZ8using namespace std

所以我试过了


// using namespace std;

struct Data
{
    using std::shared_ptr;
    
    shared_ptr<char[]> m_name = nullptr;
    
//    std::shared_ptr<char[]> m_name = nullptr;
};

从中我得到了

main.cpp:14:11:在类中使用声明引用“std::”,它不是一个类

似乎我不能在类内声明?using std::shared_ptr;

我是否遗漏了什么或真的需要在那里输入?std::shared_ptr

C++ 命名空间 std using-declaration

评论

0赞 apple apple 2/11/2023
您可以做一个模板别名,但在这种情况下应该是 imo。std::shared_ptr
0赞 Öö Tiib 2/11/2023
定义你的类型,比如使用 shared_name = std::shared_ptr<char[]>;
0赞 Pepijn Kramer 2/11/2023
只是打字有什么问题?旁注:在这种情况下,我真的建议您使用 std::shared_ptr<std::string>(假设shared_ptr确实是必要的,但很多时候并非如此)std::shared_ptr<char[]
0赞 KcFnMi 2/11/2023
没什么不对的,但是如果我们能输入,那就太酷了shared_ptr<char[]using std::shared_ptr;
0赞 sweenish 2/12/2023
不过,会吗?这在很大程度上是早期学习者的情绪。当你继续前进时,这种情绪会发生很大变化,你的项目会变得复杂。 什么都不是。std::

答:

1赞 Vlad from Moscow 2/11/2023 #1

来自 C++ 17 标准(10.3.3 使用声明)

3 在用作成员声明的 using-declaration 中,每个 using-declarator 的 nested-name-specifier 应将基类命名为 正在定义的类。如果 using 声明器命名构造函数, 其 nested-name-specifier 应命名该类的直接基类 被定义。

std::shared_ptr不是代码示例中类的基类的成员。Data

因此,编译器发出错误。

std:;shared_ptr是在命名空间中声明的类。它甚至不是某个类的成员。std

1赞 HolyBlackCat 2/11/2023 #2

某些形式的在班级机构中不起作用。这包括 和 where 不是从基类继承的。usingusing namespaceusing XX

using std::shared_ptr;如果将其移动到全局范围,则有效。

using X = Y;在类范围内工作。就您而言,它将是 .但请注意,在极少数情况下,它与拼写为略有不同(例如,将其传递给模板模板参数时)。template <typename T> using shared_ptr = std::shared_ptr<T>;std::shared_ptr


[我]真的需要在那里打字吗?std::shared_ptr

您应该键入 。省略通常会引起混淆。“是来自什么东西还是习俗?”std::shared_ptrstd::std::