我有三个模板类(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
实际上有两个,所以我无法弄清楚它会如何发挥作用。或者整个问题通常以不同的方式解决?
答案 0 :(得分:1)
您应该为using
类型添加B
到C
:
#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
。如果您需要C
在A
多个位置进行模板化,这可能会更灵活。但是,我上面写的可能更好;这只是为了证明的目的。
答案 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;
};
但我不明白你想对C
和AType
- 编辑 -
克劳斯说
在您发布的代码中,您编写
C<AType> c_objectwhich
无效,因为使用AType = A;`。我看不到你把任何类型放到别名模板AType的地方。所以你发布的代码毫无意义,因为T1和T2未被使用。
我的回答:我认为我发布的代码“没有意义,因为T1和T2未使用”,因为我不理解原始代码的含义。
但你说我的代码“无效”。
以下是我使用C<AType> c_objectwhich
和using 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()
{ }