如何在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
相关产品推荐
相关产品推荐

