C ++在不同的类中使用别名模板声明

时间:2017-10-12 11:33:15

标签: c++ c++11 templates using typename

我有三个模板类(Code in C++ Shell)和using AType = A<T1,T2>中定义的别名模板A。我想在使用A对象的文件中使用别名。

所以在B而不是写作:

C<A<T1,T2>> c_object;

我希望能够写出类似的内容:

C<typename AType> c_object;

使用A中声明的别名。

// A.h
template<typename T1, typename T2>
class A{
    A();
};
template<typename T1, typename T2>
using AType = A<T1,T2>;

// C.h
template<typename H>
// H = A<T1,T2>
class C{
    C();
};

// B.h
#include "A.h"
template<typename T1, typename T2>
class B{
    B();
    // const C<A<T1,T2>>& GetC() const;
    const C<typename AType>& GetC() const;
private:
    C<typename AType> c_object;
};

注意模板参数的关系。

如果B只有一个模板参数G,请执行以下操作:

template<typename G>
class B{};

我可以这样做:

C<typename G::AType> c_object;

但是因为B实际上有两个,所以我无法弄清楚它会如何发挥作用。或者整个问题通常以不同的方式解决?

2 个答案:

答案 0 :(得分:1)

您应该为using类型添加BC

#include "A.h"
template<class T1, class T2>
struct B{
    using C_type =  A<T1, T2>;
    B();
    // const C_type& GetC() const;
    const C_type& GetC() const;
private:
    C_type c_object;
};

或者可以将A注入B的模板参数中,这样可以让调用者可以选择更改它:

#include "A.h"
template<class T1, class T2, template<class, class> class C_T = A<T1, T2>>
struct B{
    B();
    // const C_T& GetC() const;
    const C_T& GetC() const;
private:
    C_T c_object;
}

您误解了模板别名的用途。他们只是简单地引用其他模板;它们不会隐式绑定要传递的模板参数(T1和T2不会隐式传递给OP中的A;必须指定A的模板参数。)

您可以使用模板别名简化为C模板化的A类型:

template<class T1, class T2>
using C_A = C<A<T1, T2>>;

然后您可以在C_A<T1, T2>中使用B。如果您需要CA多个位置进行模板化,这可能会更灵活。但是,我上面写的可能更好;这只是为了证明的目的。

答案 1 :(得分:-1)

问题是AType不是一种类型;它是模板模板类型。

如果您按以下方式编写C

,则编译代码
template <template <typename...> class>
class C 
 { C(); };

以这种方式传递AType

template <typename T1, typename T2>
class B
 {
      B();
      const C<AType>& GetC() const;
   private:
      C<AType> c_object;
 };

但我不明白你想对CAType

做什么

- 编辑 -

克劳斯说

  

在您发布的代码中,您编写C<AType> c_objectwhich无效,因为使用AType = A;`。我看不到你把任何类型放到别名模板AType的地方。所以你发布的代码毫无意义,因为T1和T2未被使用。

我的回答:我认为我发布的代码“没有意义,因为T1和T2未使用”,因为我不理解原始代码的含义。

但你说我的代码“无效”。

以下是我使用C<AType> c_objectwhichusing AType = A<T1,T2>;的代码。请告诉我哪里无效以及你编译它的错误。

template <typename, typename>
class A { A(); };

template <typename T1, typename T2>
using AType = A<T1,T2>;

template <template <typename...> class>
class C { C (); };

template <typename, typename>
class B
 {
      B();

      const C<AType> & GetC () const;
   private:

      C<AType> c_object;
 };

int main()
 { }


template <typename, typename>
class A { A(); };

template <typename T1, typename T2>
using AType = A<T1,T2>;

template <template <typename...> class>
class C { C (); };

template <typename, typename>
class B
 {
      B();

      const C<AType> & GetC () const;
   private:

      C<AType> c_object;
 };

int main()
 { }