使用另一个命名空间中定义的类创建命名空间

时间:2014-03-19 23:12:19

标签: c++ c++11 namespaces

我正在尝试以下代码,无论它是否有效。是否可以以任何其他方式完成,需要帮助。

 // FOO.hpp
 namespace traits {
   class FOO {
       public:
        typedef std::vector<int>     vec_t;
        typedef std::map <int, int>  map_t;
   };
  };

 namespace my_traits = traits::FOO;
 //I know the compile will give the error as "FOO" is not a namespace-name. 

 // in BAR.hpp
 using namespace my_traits;
 class BAR {
   private:
     vec_t  my_vector;   //  my_traits will have FOO's members (typedefs)
     map_t  my_map;      //  my_traits will have FOO's members (typedefs)
  };




  I **don't** want to do the following :
  using namespace traits;
  class BAR {
    private:
      traits::FOO::vec_t  my_vector  //  AVOID
      traits::FOO::map_t  my_map     //  AVOID
  }

但基本上我想将所有typedef放在FOO类中,然后使用FOO作为命名空间。我不想将typdef放在任何名称空间中。

在C ++ 11(或通常的C ++)中是否可行。

谢谢

2 个答案:

答案 0 :(得分:0)

您不能将class用作namespace,您必须使用真实namespace

namespace traits {
    namespace FOO {
        typedef std::vector<int>     vec_t;
        typedef std::map <int, int>  map_t;
    };
};

namespace my_traits = traits::FOO;

using namespace my_traits;
class BAR {
private:
    vec_t  my_vector;   //  my_traits will have FOO's members (typedefs)
    map_t  my_map;      //  my_traits will have FOO's members (typedefs)
};

答案 1 :(得分:0)

尝试适应你在Remy的解决方案下面的评论中所描述的内容:

如果BAR 不是类模板,则您有以下选项:

namespace traits
{
    template<typename T>
    struct FOO
    {
        using vec_t = std::vector<T>;
        using map_t = std::map<int, T>;
    };
};

// in BAR.hpp

class BAR : traits::FOO<int>
{
    vec_t my_vector;
    map_t my_map;
};

因此,通过继承具体类BAR,类型别名在FOO<int>中可用,其中FOO是您请求的类模板。这很方便。

但是,如果BAR 是类模板本身就像

那样
template<typename F>
class BAR : F { ... }

(例如某些F的{​​{1}}为FOO<T>),以上内容不太适用:您必须声明

T

为您要使用的using vec_t = typename F::vec_t; using map_t = typename F::map_t; 的每个别名。但是,即使你没有制作这些别名,你仍然可以说

F

这不是太糟糕。