可能重复:
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”关键字也用于访问特定命名空间的成员。
所以,我猜测编译器根据声明的位置决定“使用”的语义。
答案 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;
然后在头文件中节省大量的输入和混乱。这些都不会影响代码的其余部分 - 通过最后的使用将父进入其正确的命名空间,一切正常。