在C ++中使用名称空间指令的正确方法

时间:2019-02-03 08:18:48

标签: c++

在各种权威资料中,我看到了使用命名空间的各种方法。 C ++标准不注重正确使用命名空间。

假设我们有以下代码:

示例。h

weight <- c(rep(0.3, 5), rep(1.2, 10), rep(2.5, 10), rep(0.9, 5)) # 30 observations 
a <- rbinom(30, 1, 0.5)
b <- rbinom(30, 1, 0.7)
c <- rbinom(30, 1, 0.6)
d <- rbinom(30, 1, 0.5)
e <- rnorm(30, mean =3)
level <- c(rep("low", 10), rep("medium", 5), rep("high", 15))
outcome <- rnorm(30, mean =10, sd =2)

data <- data.frame(weight, a, b, c, d, e, level = as.factor(level), outcome)

library(party)
res <- cforest(outcome ~. , data = data[,-1], weights = data$weight)
varimp(res)
Warning message:
In varimp(res) :
  ‘varimp’ with non-unity weights might give misleading results

这是两种实现方式:

example1.cpp

namespace Example {
    class MyClass
    {
    public:
        MyClass();
    } 
}

example2.cpp

#include "example.h"

using namespace Example;

MyClass::MyClass();

这两个实现在gcc中编译时都不会发出警告,因此,这纯粹是代码纯净或美观的问题。但是无论如何,这两种方法的优缺点是什么?

1 个答案:

答案 0 :(得分:1)

两个示例不相同:

第一个(using namespace Example;)将使编译器看到当前名称空间中所有已使用的名称空间。 (意味着您无需指定名称空间,除非与其他名称空间存在歧义)

第二个(namespace Example {...})将为名称空间添加符号和代码。但是从名称空间外部来看,它不会像在当前名称空间中那样被看到。

  • 您无需为当前名称空间声明using
  • 一个块只能在一个名称空间中,但可以使用多个名称空间。

例如:

//consider the following namespace
Namespace A
{
  void f()
  {

  }
}

main中,您有两个选择:

使用命名空间进行呼叫

int main()
{
  A::f();
  ...
}

或添加using并在没有名称空间的情况下调用。

using namespace A;
int main()
{
  f();
  ...
}

但是您不能将main添加到命名空间中,因为编译器不会找到它:

namespace A {
  int main()
  {
    f();
    ...
  }
}

将导致错误:

  

对“ main”的未定义引用