【问题标题】:"Using" declaration with scope only on current class?仅在当前类上使用范围的“使用”声明?
【发布时间】:2014-12-05 09:45:04
【问题描述】:

是否有可能有一个using 指令,其范围仅限于单个类?

请注意,我要“使用”的内容不包含在当前类的父类中。

为简单起见,假设以下示例:

#include<vector>

class foo
{
using std::vector; //Error, a class-qualified name is required
}

另一个有趣的事情是,如果包含using 指令,是否包含标头:

MyClassFoo.h:
#include<vector>

using std::vector; //OK
class foo
{

}

NewHeader.h
#include "MyClassFoo.h"
...

如何防止“using std::vector”在此处显示?

【问题讨论】:

  • 是否有可能为“std::vector”创建一个模板类型别名,然后称为“vector”?这样,它的作用与我希望在类中使用 std::vector 所做的相同
  • 是的,using 声明可以在创建类型别名时进行模板化,并且可以调用该类型别名 vector,因为它位于 std::vector 的另一个范围内。
  • 我认为值得指出的是,这不是using 指令,而是using 声明。使用指令引入命名空间
  • 谢谢,我把“指令”改成了“声明”
  • 使用wrapper namespace接近你想要的。

标签: c++ c++11 using using-directives


【解决方案1】:

自从你标记了 c++11:

#include<vector>

class foo
{
  template<typename T>
  using vector = std::vector<T>;
};

【讨论】:

  • 另外,template&lt;class T, class... Args&gt; using vector = std::vector&lt;T, Args...&gt;; 如果您有任何使用可选分配器的倾向。
  • 这看起来不错,但不幸的是它给了我“无法识别的模板声明/定义”?!
  • @S.H 你需要用 -std=c++11 和足够新的编译器编译
  • 由于我是用 C++11 编译的,所以是 VS2012 的问题 -> link 支持的 VS C++11 特性
  • @S.H 是的,它似乎是在 VS2013 中引入的:msdn.microsoft.com/en-us/library/vstudio/dn467695.aspx,sad =/
【解决方案2】:

至于您的第一个要求,您可以使用命名空间,以便将using namespace 的范围限制为单个类。

#include<vector>

namespace FooClasses
{
    using namespace std; //The scope of this statement will NOT go outside this namespace.

    class foo
    {
      vector<int> vecIntVector; 
    };

}// namespace FooClasses

对于第二种情况,请明智地使用#define#undef

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-18
    • 2015-02-08
    • 2015-10-02
    • 1970-01-01
    相关资源
    最近更新 更多