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

C++模板类型推断在Windows与Android平台上结果不一致的问题求助

C++模板类型推断在Windows与Android平台上结果不一致的问题求助

各位大佬好,我最近碰到一个特别头疼的问题,同样一段C++模板代码,在Windows和Android平台编译运行后的结果居然不一样,想请大家帮忙分析下到底是哪出问题了。

先贴出我的代码片段:

#include <iostream>
#include <cstdint>

template<class T, class IsNum = void, class IsEnum = void>
struct TestStruct{
    TestStruct(const T& val, void* val2){
        std::cout << "A" << std::endl;
    }
};

template<class T>
struct TestStruct<T, 
// 这里用typename或者class,在clang编译器下会得到不同的运行结果
class std::enable_if<std::is_arithmetic<T>::value>::type, void>  
{
    TestStruct(const T& val, void* val2){
        std::cout << "B" << std::endl;
    }
};

// 测试代码
int main() {
    int a = 10;
    TestStruct<int> test(a, nullptr);
    return 0;
}

具体问题是这样的:

  • 在Windows平台用MSVC编译时,不管我把模板参数里的class换成typename,运行程序都会输出"B",也就是正确匹配到了针对算术类型的特化版本。
  • 但到了Android平台用clang编译时,如果用class std::enable_if<...>::type,程序会输出"A"(匹配主模板);只有换成typename std::enable_if<...>::type,才会输出"B"(匹配特化版本)。

我之前了解过typename在模板里是用来指明依赖类型名的,但这里用class为什么在不同编译器上表现差异这么大?是clang和MSVC对C++标准的实现有分歧,还是我这个特化的写法本身就不规范?有没有什么通用写法能让代码在两个平台上都能正确工作?

期待各位大佬的解答,谢谢!

备注:内容来源于stack exchange,提问作者Mr. Duan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.13 17:29:42