访问声明已弃用,建议使用using声明;建议添加‘using’关键字。

4

我回到了我以前完成的一个C++学校作业,它实现了一个二叉树。我有一个文件(Tree.cpp),其中包含插入、查找、删除等节点的函数。在顶部,我有"using namespace std;"。我收到的警告是由另一个文件SymTab.hpp引起的,它看起来像这样:

#ifndef SYMTAB_H
#define SYMTAB_H

#include <iostream>
#include "Tree.hpp"
using namespace std;

template <class Whatever>
class SymTab : private Tree<Whatever> {
public:
        Tree<Whatever> :: Insert;
        Tree<Whatever> :: Lookup;
        Tree<Whatever> :: Remove;
        Tree<Whatever> :: Write;
        Tree<Whatever> :: Set_Debug_On;
        Tree<Whatever> :: Set_Debug_Off;
};

#endif

public:之后的每一行都会给出一个警告,如下所示:

"SymTab.hpp:11:9: 警告:访问声明已过时,应优先使用声明;建议:添加“using”关键字[-Wdeprecated] Tree :: Insert;",其中“Insert”将被替换为每个相应的函数名称。

有关命名空间的任何建议以及如何消除这些警告?


1
添加using关键字,就像它所建议的那样? - doctorlove
3
绝对不要在头文件中放置using指令。这意味着包含该头文件的任何内容都将获得整个std库。如果其中存在冲突并且它们想使用您的头文件,则您的头文件可能会失败。 - ghostofstandardspast
1个回答

7

有两个不同的问题。编译器提到的是SymTab中的"访问声明"。只需将其更改为以下内容:

template <class Whatever>
class SymTab : private Tree<Whatever> {
public:
        using Tree<Whatever> :: Insert;
        using Tree<Whatever> :: Lookup;
        using Tree<Whatever> :: Remove;
        using Tree<Whatever> :: Write;
        using Tree<Whatever> :: Set_Debug_On;
        using Tree<Whatever> :: Set_Debug_Off;
};

另一个没有关联的问题是在头文件中使用using namespace std;。这不是实际上的错误,但这是一个TM坏主意。它会导致整个std命名空间被倾泻到全局命名空间中,对于包含该头文件的所有人来说都无法避免。它可能会导致一些常见名称(如transformlistsort)与定义在std命名空间中的这些名称发生冲突。只需删除using指令即可。

谢谢,这个解释非常详细,解决了警告!作为后续,我的其他头文件顶部都有 using namespace std; 这样的语句。我应该删除这些行吗? - user3750325
1
@user3750325 是的,你肯定应该删除它们! - Baum mit Augen
1
如果您是唯一一个编辑这些文件的人 - 不,这可能不值得努力。如果您将与任何人分享项目 - 是的,绝对值得。 - Paweł Stawarz
1
如果您是唯一一个使用这些文件的人,我会说“if you're the only one that will ever use those files.” - Angew is no longer proud of SO
1
@Angew 我认为如果你考虑到我评论的第二句话,就没有区别了 :) - Paweł Stawarz

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