我在C++中使用'using'声明将std :: string和std :: vector添加到本地命名空间(以节省输入不必要的'std ::').
using std::string;
using std::vector;
class Foo { /*...*/ };
Run Code Online (Sandbox Code Playgroud)
这个声明的范围是什么?如果我在标题中执行此操作,它会将这些"using"声明注入到包含标题的每个cpp文件中吗?
C++ 0x具有模板别名(有时称为模板typedef).看到这里.目前的C++规范没有.
你喜欢用什么来解决这个问题?容器对象还是宏?你觉得它值得吗?
考虑以下程序.根据c ++标准(参考所需标准的相关部分)是否格式良好:
namespace X { extern int i; }
namespace N { using X::i; }
int N::i = 1;
int main() {}
Run Code Online (Sandbox Code Playgroud)
我为不同的编译器得到了不同的结果.我正在试图弄清楚我应该为哪个编译器提交错误报告:
Clang:给出以下编译器错误:名称空间'N'中没有名为'i'的成员
GCC和Visual C++编译它没有错误.
为了比较,下面给出了所有三个编译器的编译器错误:
namespace X { void f(); }
namespace N { using X::f; }
void N::f() {};
int main() {}
Run Code Online (Sandbox Code Playgroud) 我在以下位置定义了以下用户定义的文字MyLiteral.h:
namespace my_literals {
constexpr uint64_t operator"" _nanoseconds(unsigned long long int value) {
return value*1000;
}
}
Run Code Online (Sandbox Code Playgroud)
现在我可以在另一个标题中使用运算符SomeComponent.h:
using namespace my_literals;
namespace foo {
constexpr uint64_t timeout = 10_nanoseconds;
}
Run Code Online (Sandbox Code Playgroud)
但是,我不想污染范围using namespace my_literals,因为这会为*.cpp包含的所有文件提供文字定义SomeComponent.h.
我怎么能避免这个?在g ++中constexpr uint64_t timeout = my_literals::10_nanoseconds;给出数字常量之前的预期unqualified-id.
我知道我把using指令的范围限制在一个块或一个函数放在里面.然后它将仅适用于该范围.但是如果块是a,namespace它通过相同命名空间的所有块显然适用.那是对的吗?至少,以下示例表明:(http://ideone.com/K8dk7E)
namespace N1
{
struct Foo{};
}
namespace N2
{
using namespace N1;
Foo f;
}
namespace N2
{
Foo f2;
}
int main()
{
N2::f2;
}
Run Code Online (Sandbox Code Playgroud)
我本来应该Foo f2给出一个错误,因为Foo应该是未知的.所以我真正的问题是,using对于同一名称空间的所有块,名称空间块中的语句是否有效?
当所有cpp文件被包含在一起编译时会导致问题,因为它会污染其他cpp文件,这些文件不应该包含其他命名空间(放置using指令的那个).因此,实际上它可能会导致不良冲突.
我知道之前已经提出过一个非常相似的问题,"在c ++头文件中使用命名空间",但我的内部是命名空间.
namespace foo {
using namespace std; // what does this do?
class Bar { ... }
}
Run Code Online (Sandbox Code Playgroud)
这是否与其他问题完全相同,只是在所有地方使用声明?它只在该命名空间中执行吗?它只在标题中执行吗?
c++ ×6
namespaces ×2
c++11 ×1
c++14 ×1
constexpr ×1
definition ×1
scope ×1
templates ×1
type-safety ×1
using ×1