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

如何在C++模板中无需手动输入类名传递类型参数?

问题解决:模板参数需传入类型而非类型名称字符串

错误原因

typeid(b).name()返回的是**const char*类型的字符串字面量**,它是对类型的文本描述,而非类型本身。而你的模板A<T>要求T是一个类型,两者类型不匹配,因此触发报错。

正确写法

你的核心需求是让A类能接受任意类作为成员属性,直接传递类型本身作为模板参数即可,不需要用typeid的返回值:

方法1:直接指定类型

int main()
{
    B b(1);
    A<B> a(b); // 直接用B作为模板参数
}

方法2:自动推导变量类型

如果不想手动写类型名,可以用decltype推导变量b的类型:

int main()
{
    B b(1);
    A<decltype(b)> a(b); // decltype(b)会自动得到B类型
}

如果需要获取类型名称

如果你的需求还包括在A类中获取该类型的名称字符串,可以在模板内部通过typeid(T).name()获取,无需把字符串作为模板参数:

#include <iostream>
#include <typeinfo>

template<class T>
class A
{
public:
    T t;
    // 静态成员存储当前模板参数的类型名称
    static constexpr const char* type_name = typeid(T).name();

    A(T t1) : t(t1) {} // 用初始化列表初始化成员更规范
};

class B
{
public:
    int i;
    B(int i1) : i(i1) {}
};

// 使用示例
int main()
{
    B b(1);
    A<B> a(b);
    // 输出类型名称(具体格式取决于编译器,比如GCC会输出"B")
    std::cout << A<B>::type_name << std::endl;
}

内容的提问来源于stack exchange,提问作者Aboody13

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 17:42:18