You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 08:53:14