C++ 在不同 类 中使用别名模板声明
C++ use alias template declaration in different classes
我得到了三个模板 类 (Code in C++ Shell) 和一个在 A
中定义的别名模板 using AType = A<T1,T2>
。我想在使用 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
实际上有两个,我无法弄清楚那将如何解决。还是整个问题通常以不同的方式解决?
问题是 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
做什么
-- 编辑--
克劳斯说
In your posted code you write C<AType> c_objectwhich
is invalid as using AType = A;`. I can't see the place where you put any type to aliased template AType. So your posted code makes no sense as T1 and T2 are unused.
我的回答:我假设是我贴的代码"makes no sense as T1 and T2 are unused",因为我不明白原代码的意义。
但是你说我的代码"is invalid".
以下是我使用 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()
{ }
您应该为 C
类型添加一个 using
到 B
:
#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 的模板参数)。
您可以使用模板别名简化为 A
编写模板化的 C
类型:
template<class T1, class T2>
using C_A = C<A<T1, T2>>;
然后您可以在 B
中使用 C_A<T1, T2>
。如果您需要在多个位置的 A
上模板化 C
,这可能会更灵活。但是,我上面写的可能更可取;这仅用于演示目的。
我得到了三个模板 类 (Code in C++ Shell) 和一个在 A
中定义的别名模板 using AType = A<T1,T2>
。我想在使用 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
实际上有两个,我无法弄清楚那将如何解决。还是整个问题通常以不同的方式解决?
问题是 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
-- 编辑--
克劳斯说
In your posted code you write
C<AType> c_objectwhich
is invalid as using AType = A;`. I can't see the place where you put any type to aliased template AType. So your posted code makes no sense as T1 and T2 are unused.
我的回答:我假设是我贴的代码"makes no sense as T1 and T2 are unused",因为我不明白原代码的意义。
但是你说我的代码"is invalid".
以下是我使用 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()
{ }
您应该为 C
类型添加一个 using
到 B
:
#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 的模板参数)。
您可以使用模板别名简化为 A
编写模板化的 C
类型:
template<class T1, class T2>
using C_A = C<A<T1, T2>>;
然后您可以在 B
中使用 C_A<T1, T2>
。如果您需要在多个位置的 A
上模板化 C
,这可能会更灵活。但是,我上面写的可能更可取;这仅用于演示目的。