使用CRT模式时std::is_same_v意外返回false(预期为true)
问题:派生类同名类型别名导致基类别名被隐藏的解决办法
运行以下示例代码时,std::is_same_v<typename Scalar<int,1>::Scalar,int>返回false,但预期结果应为true。问题源于Scalar结构体中的using Name = Scalar语句,它隐藏了基类base中定义的using Scalar = T类型别名。要求在不修改基类中using Scalar=T的前提下解决该问题。
示例代码:
#include <iostream> #include <type_traits> template <template <typename,unsigned,typename...>typename interface,typename T,unsigned ChannelN, typename...Args> struct base : public interface<T,ChannelN,Args...>{ public: using Scalar = T; }; template<typename T, unsigned ChannelN,typename... ColourT> struct I{ }; template <typename T,unsigned ChannelN> struct Scalar : public base<I,T,ChannelN> { using DoubleT = double; using Name= Scalar; using base<I, T, ChannelN>::base; }; int main() { std::cout<<std::is_same_v<typename Scalar<int,1>::Scalar,int>; return 0; }
解决办法
方法一:显式引入基类的Scalar别名
在派生类Scalar中添加语句,强制引入基类的类型别名,覆盖类名带来的隐藏效应:
template <typename T,unsigned ChannelN> struct Scalar : public base<I,T,ChannelN> { using DoubleT = double; using Name= Scalar; using base<I, T, ChannelN>::base; using base<I, T, ChannelN>::Scalar; // 显式引入基类的Scalar别名 };
修改后,Scalar<int,1>::Scalar会正确指向基类中定义的int类型,std::is_same_v将返回true。
方法二:明确指定Name别名的模板实例
把using Name = Scalar;改为明确指定模板实例的写法,避免让类名Scalar在派生类作用域中被优先解析:
template <typename T,unsigned ChannelN> struct Scalar : public base<I,T,ChannelN> { using DoubleT = double; using Name= Scalar<T, ChannelN>; // 明确指定模板实例 using base<I, T, ChannelN>::base; };
这种方式下,基类的Scalar别名不会被派生类的类名隐藏,能正常被访问。
内容的提问来源于stack exchange,提问作者Dong
相关产品推荐
相关产品推荐

