3

我有一个带有模板转换运算符的模板基类。我想在派生类中取消隐藏这个模板化转换运算符(因为依赖名称查找)。

template <class T>
class A
{
public:
  template <class U>
  operator A<U>() const { ... }
};

template <class T>
class B : public A<T>
{
public:
  template <class U>
  using A<T>::operator A<U>;
};

有没有办法做到这一点?上面的代码不起作用,因为它告诉我不能模板化 using 声明

4

2 回答 2

2

using-declaration 不能引用模板 ID、命名空间、作用域枚举器、基类的析构函数或用户定义转换函数的成员模板的特化。

于 2015-11-20T14:47:28.060 回答
1

模板化转换运算符将可通过参数相关查找获得。本质上,由于您总是使用B实例进行转换,A因此不会隐藏 ' 转换运算符:

#include <iostream>


template <class T>
class A
{
public:
  template <class U>
  operator A<U>() const { 
      std::cout << "The cast operator becomes availble through ADL\n";
      return {}; 
  }
};

template <class T>
class B : public A<T>
{
};

int main()
{
    A<double> a1; 
    A<int> a2;

    B<double> b1; 
    B<int>    b2; 

    a1 = b2; 
    a2 = b1; 
}

Demo

于 2015-11-21T13:19:28.680 回答