标签: using-directives

为什么"使用命名空间std"被认为是不好的做法?

我已经告诉别人,编写using namespace std;代码是错误的,我应该用std::coutstd::cin直接代替.

为什么被using namespace std;认为是不好的做法?是低效还是冒着声明模糊变量(与名称std空间中的函数具有相同名称的变量)的风险?它会影响性能吗?

c++ namespaces using-directives std c++-faq

2486
推荐指数
36
解决办法
78万
查看次数

找不到类型或命名空间名称

我有C#几个项目的解决方案Visual Studio 2010.一个是测试项目(我将其称为" PrjTest "),另一个是Windows Forms Application项目(我将其称为" PrjForm ").还有一个由PrjForm引用的第三个项目,它能够成功引用和使用.

PrjForm引用PrjTest,而PrjForm有一个带有using语句的类:

using PrjTest;
Run Code Online (Sandbox Code Playgroud)
  1. 参考已正确添加
  2. using 声明正确到位
  3. 拼写是正确的
  4. PrjTest构建成功
  5. PrjForm几乎可以构建,但是会using PrjTest;出现错误:

找不到类型或命名空间名称'PrjTest'(您是否缺少using指令或程序集引用?)

我尝试过以下方法来解决这个问题:

  1. 删除了Resharper(因为Resharper在识别引用的项目时没有遇到任何麻烦,我认为它可能值得一试)
  2. 删除并重新添加了引用和using语句
  3. 从头开始重新创建PrjForm
  4. PrjForm目前驻留在PrjTest文件夹中,我尝试将其移动到外部文件夹
  5. 使用新的副本在另一台计算机上加载解决方案 VS 2010

我做完了我的功课,花了很长时间在线寻找答案,但这些解决方案都没有帮助.

我还能尝试什么?

c# reference using-directives using-statement visual-studio-2010

454
推荐指数
9
解决办法
75万
查看次数

用于放置using指令的Visual Studio或Resharper功能

我喜欢将我的using指令放在当前命名空间内,而不是在外面,因为VS和Resharper默认放置它们.

有没有人知道一个宏/标准功能,它排除/删除未使用的using指令并将它们放在当前的命名空间中?

resharper using-directives visual-studio

120
推荐指数
4
解决办法
3万
查看次数

为什么是“使用系统”;不被认为是不好的做法?

我有 C++ 背景,我完全理解并同意这个问题的答案:Why is “using namespace std;” 被认为是不好的做法?

所以我很惊讶,现在有了 C# 的一些经验,我看到了完全相反的情况: using Some.Namespace;字面上到处都在使用。每当您开始使用类型时,首先为其命名空间添加 using 指令(如果它还没有的话)。我不记得看过一个.cs不以using System; using System.Collections.Generic; using X.Y.Z; etc.... 事实上,如果您通过 Visual Studio 向导添加一个新文件,它会自动在那里添加一些 using 指令,即使您可能根本不需要它们。因此,虽然在 C++ 社区中您基本上会受到私刑,但 C# 甚至鼓励这样做。至少在我看来是这样。

现在,我明白在 C# 和 C++ 中使用指令并不完全相同。另外,我确实明白,您可以using namespace在 C++ 中做的最讨厌的事情之一,即将它放在头文件中,由于缺乏头文件和#include.

然而,尽管存在差异,但在 C# 和 C++ 中使用指令的目的是相同的,只需一直输入SomeType,而不是更长的时间Some.Namespace.SomeType(在 C++ 中使用::而不是.)。出于同样的目的,对我来说,危险似乎也是一样的:命名冲突。

在最好的情况下,这会导致编译错误,因此您“只需”修复它。在最坏的情况下,它仍然可以编译,并且代码会默默地做与您预期不同的事情。所以我的问题是:为什么(显然)使用在 C# 和 C++ 中被认为如此糟糕的指令?

我对答案的一些想法(不过,这些都没有真正让我满意):

  • 与 C++std相比,C# 中的命名空间往往更长,嵌套更多(vs. System.Collection.Generic)。因此,以这种方式对代码去噪有更多的愿望和更多的收获。但即使这是真的,这个论点也只适用于我们查看标准命名空间时。在 C# 和 …

c# c++ using-directives

54
推荐指数
1
解决办法
3030
查看次数

为什么使用声明不能解决钻石问题?

请考虑以下代码:

struct A
{
    void f()
    {
    }
};

struct B1 : A
{
};

struct B2 : A
{
};

struct C : B1, B2
{
    void f() // works
    {
        B1::f();
    }
    //using B1::f; // does not work
    //using B1::A::f; // does not work as well
};

int main()
{
    C c;
    c.f();

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我恳请你不要复制粘贴标准答案如何解决钻石问题("使用虚拟继承").我在这里问的是为什么在这种情况下使用声明不起作用.确切的编译器错误是:

In function 'int main()':
prog.cpp:31:6: error: 'A' is an ambiguous base of 'C'
  c.f();
Run Code Online (Sandbox Code Playgroud)

我得到的印象是使用声明应该从这个例子开始:

struct A
{
    void f()
    { …
Run Code Online (Sandbox Code Playgroud)

c++ inheritance using-directives subclass diamond-problem

51
推荐指数
3
解决办法
3406
查看次数

C++:我应该使用'typedef'还是'using namespace'?

我正在编写一个包含多个依赖模块的库.当我包含来自不同模块的文件时,我是否应该使用以下命令解析命名空间:

using namespace project1::namespace1;
class1 obj;
Run Code Online (Sandbox Code Playgroud)

要么

typedef project1::namespace1::class1 class1;
class1 obj;
Run Code Online (Sandbox Code Playgroud)

每种方法的优缺点是什么?我读到了我们应该typedef在.H文件和using.C文件中使用的地方,这是可取的吗?

我遇到的'typedef'的一个问题是,如果我在第三个模块中包含原始类和带有'typedef'的类,则会导致名称空间不明确.

c++ namespaces using-directives

39
推荐指数
3
解决办法
1万
查看次数

使用std :: array并使用"array"作为名称

在我的C++ JSON库中,我最近使用GCC7进行了回归.我删除了受影响的代码,希望了解错误.

代码

考虑这个标题myclass.hpp:

#pragma once

template <typename X>
struct A
{
    struct value_t
    {
        X array;
    };

    static A array()
    {
        return A();
    }

    friend bool operator<(const A& lhs, const A& rhs) noexcept
    {
        return lhs.val.array < rhs.val.array;
    }

    value_t val = {};  
};
Run Code Online (Sandbox Code Playgroud)

如您所见,我在struct中使用名称"array"作为成员变量名称value_t,作为静态函数的名称.然后我在以下文件中包含标题:

#include <array>
using std::array; // note this!
#include "myclass.hpp"

int main()
{}
Run Code Online (Sandbox Code Playgroud)

问题

代码用GCC6和Clang5(使用-std=c++11)编译,但GCC7报告:

In file included from example.cpp:3:0:
myclass.hpp: In function 'bool operator<(const …
Run Code Online (Sandbox Code Playgroud)

c++ using-directives c++11 stdarray

27
推荐指数
1
解决办法
969
查看次数

C++'typedef'与'using ... = ...'

可能重复:
typedef和在C++ 11中使用有什么区别?

以下代码编译并运行.我的问题是"typedef"和"using"方法之间用于重命名模板特化的区别是什么?

template<typename T>
struct myTempl{
    T val;
};

int main (int, char const *[])
{
    using templ_i = myTempl<int>;
    templ_i i;
    i.val=4;

    typedef myTempl<float> templ_f;
    templ_f f;
    f.val=5.3;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

编辑:

如果没有差异,你更喜欢哪一个?/为什么引入使用... = ...版本?

c++ typedef using-directives c++11

26
推荐指数
1
解决办法
3万
查看次数

为什么 C++ 的“使用命名空间”的工作方式如此?

所有学生都对 C++ using-directives的行为感到惊讶。考虑这个片段(Godbolt):

namespace NA {
    int foo(Zoo::Lion);
}
namespace NB {
    int foo(Zoo::Lion);
    namespace NC {
        namespace N1 {
            int foo(Zoo::Cat);
        }
        namespace N2 {
            int test() {
                using namespace N1;
                using namespace NA;
                return foo(Zoo::Lion());
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

你可能认为test会叫NAfoo(Zoo::Lion); 但实际上它最终会调用N1's foo(Zoo::Cat)

原因是这using namespace NA实际上并没有将名称NA带入当前范围;它带来他们到最小共同祖先的范围NAN2,这是::。并且using namespace N1不会将名称N1带入当前 …

c++ using-directives rationale name-lookup c++98

26
推荐指数
1
解决办法
815
查看次数

在struct/class声明中使用using指令?

我发现我的C++ 头文件很难用所有完全限定类型(比4个嵌套命名空间一样深)读取(并且输入真的很繁琐).这是一个问题(所有答案都提供了实现它的混乱替代方案,但这不是问题):是否有强烈的理由反对在C++语言的结构和类中引入作用域使用指令(尽管允许使用作用域 -功能声明)?

例如

class Foo : public Bar
{
    using namespace System;
    using namespace System::Network;
    using namespace System::Network::Win32::Sockets;
    using Bar::MemberFunc; // no conflict with this

    // e.g. of how messy my header files are without scoped using-directive
    void FooBar(System::Network::Win32::Sockets::Handle handle, System::Network::Win32::Sockets::Error& error /*, more fully-qualified param declarations... */);
};
Run Code Online (Sandbox Code Playgroud)

既然namespace是一个关键字,我会认为它足够明显,不会与使用声明的范围发生冲突,例如Bar::MemberFunc.

编辑:仔细阅读问题--->我加粗了.提醒:我们不是在讨论如何提高示例的可读性.提示using指令范围的中如何实现在C++语言(通过增加关键字/结构等手段IE)是不是一个答案(如果你能找到实现这个使用现有的C++语言标准的一个优雅的方式,那么它会的当然是一个答案)!

c++ language-features using-directives

24
推荐指数
2
解决办法
2万
查看次数