【问题标题】:Aggregated template specialisation between convertible types可转换类型之间的聚合模板特化
【发布时间】:2022-01-04 13:13:15
【问题描述】:

考虑这些模板类:

template <typename T>
class A{
  T m_t;
public:
  A(T t):m_t(t){};
};

template <typename T, typename D>
class B{
  A<D> m_a;
  T m_t;
public:
  B(T t, A<D> a):m_t(t),m_a(a){};
};

这当然会起作用: A&lt;int&gt; a{1}; .

这也将起作用,因为隐式转换: A&lt;int&gt; a{'e'};

但这不会:

A<char> a{'e'}
B<int,int> b(1,a)

有什么解决方法吗?在实例化 B 类时,我希望在 char 和 int 之间进行隐式转换。

【问题讨论】:

    标签: c++ templates


    【解决方案1】:

    A&lt;char&gt;A&lt;int&gt; 是两个完全独立的类。但是你总是可以在A模板中添加一个对应的转换构造函数:

    template <typename U>
    A(A<U> a) : m_t(a.m_t) { }
    
    template <typename U> friend class A;
    

    现场演示:https://godbolt.org/z/xejPz5KM9

    请注意,您需要通过 friend 声明向所有 A 实例提供对私有成员 m_t 的访问权限。否则,A&lt;U&gt; 将无法正常访问A&lt;T&gt;.m_t

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-22
      • 2014-02-08
      • 2021-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多