从模板化基础中取消隐藏模板化转换运算符 class
Unhide templated cast operator from templated base class
我有一个带有模板化转换运算符的模板化基础 class。我想在派生的 class 中取消隐藏此模板化转换运算符(因为依赖名称查找)。
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 声明。
using 声明不能引用模板 ID、命名空间、作用域枚举器、基类的析构函数 class 或成员模板的特化对于用户定义的转换函数。
模板化转换运算符将可通过参数相关查找获得。本质上,由于您总是使用 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;
}
我有一个带有模板化转换运算符的模板化基础 class。我想在派生的 class 中取消隐藏此模板化转换运算符(因为依赖名称查找)。
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 声明。
using 声明不能引用模板 ID、命名空间、作用域枚举器、基类的析构函数 class 或成员模板的特化对于用户定义的转换函数。
模板化转换运算符将可通过参数相关查找获得。本质上,由于您总是使用 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;
}