为什么我不能在c ++ struct中使用namespace指令?

时间:2012-03-24 23:21:32

标签: c++

  

可能重复:
  Scoped using-directive within a struct/class declaration?
  Why “using namespace X;” is not allowed inside class/struct level?

我想仅将std :: string引入结构中。 为什么以下被认为是非法的?

#include <iostream>
#include <string>

struct Father
{
    using std::string;

    string sons[20];
    string daughters[20];
};

但奇怪的是,我可以在函数中执行以下操作

int main()
{
    using std::string;
}

更新:C ++使用具有不同语义的相同关键字。

c ++使用关键字“using”将基类中的数据成员或函数引入当前类。因此,当我在结构声明中使用std :: string编写时,编译器假设我正在尝试从基类std中引入成员。但是std不是基类,而是名称空间。 因此

struct A
{
     int i;
}

struct B:A
{
     using A::i; // legal
     using std::string// illegal, because ::std is not a class
}

相同的“using”关键字也用于访问特定命名空间的成员。

所以,我猜测编译器根据声明的位置决定“使用”的语义。

2 个答案:

答案 0 :(得分:2)

我不知道您实际问题的答案,但您可以使用typedef:

struct Father
{
    typedef std::string string;

    string sons[20];
    string daughters[20];
};

答案 1 :(得分:0)

不幸的是,语言不允许这样做,但有一个解决方法:

namespace Father_Local
{
    using std::string;

    struct Father
    {
        //...
    };
}

using Father_Local::Father;

这种方法的优点是你原则上可以写一个using指令,例如

using namespace boost::multi_index;

然后在头文件中节省大量的输入和混乱。这些都不会影响代码的其余部分 - 通过最后的使用将父进入其正确的命名空间,一切正常。