Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从模板基类取消隐藏模板强制转换运算符_C++_Templates_Inheritance_Dependent Name - Fatal编程技术网

C++ 从模板基类取消隐藏模板强制转换运算符

C++ 从模板基类取消隐藏模板强制转换运算符,c++,templates,inheritance,dependent-name,C++,Templates,Inheritance,Dependent Name,我有一个带模板转换操作符的模板基类。我想在派生类中取消隐藏此模板转换运算符(因为依赖名称查找) 模板 甲级 { 公众: 模板 运算符A()常量{…} }; 模板 B类:公共A { 公众: 模板 使用A::运算符A; }; 有办法做到这一点吗?上面的代码不起作用,因为它告诉我我不能为using声明模板。using声明不能引用模板id、命名空间和作用域枚举器,到基类的析构函数,或到用户定义转换函数的成员模板的专门化。模板化转换运算符将通过参数相关的查找可用。本质上,由于您总是使用B实例进行转换,a

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

模板
甲级
{
公众:
模板
运算符A()常量{…}
};
模板
B类:公共A
{
公众:
模板
使用A::运算符A;
};

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

using声明不能引用模板id、命名空间和作用域枚举器,到基类的析构函数,或到用户定义转换函数的成员模板的专门化。

模板化转换运算符将通过参数相关的查找可用。本质上,由于您总是使用
B
实例进行转换,
a
的cast操作符不会被隐藏:

#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; 
}
#包括
模板
甲级
{
公众:
模板
运算符A()常量{

std::cout您如何尝试使用运算符?转换为具有相同语义值的B的不同表示形式。将其用于科学单位(如boost::units)的实践项目,T是std::ratio(如std::chrono::duration)。我想看看是否可以将转换行为抽象为基类。
#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; 
}