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;
 };

但我不明白你想用 CAType

做什么

-- 编辑--

克劳斯说

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_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()
 { }

您应该为 C 类型添加一个 usingB

#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,这可能会更灵活。但是,我上面写的可能更可取;这仅用于演示目的。