当我这样做时......
auto t = typeid(float);
......我明白了:
错误C2248'type_info :: type_info':无法访问类'type_info'中声明的私有成员
当然,我知道我可以做到这一点......
auto t = typeid(float).name();
但是如果我想使用第一个表达式,我将如何篡改type_info类并使用朋友来实现我的目标?有什么建议吗?
答案 0 :(得分:2)
您不能让自己的班级成为标准班级的friend
。
typeid
表达式是左值,因此您可以简单地绑定对它的引用:
auto& t = typeid(float);
答案 1 :(得分:2)
您无法执行此操作的原因是复制构造函数和std::type_info
的赋值运算符按[type.info]标记为delete
。所以
auto t = typeid(float);
将尝试调用将失败的复制构造函数。
正如TartanLlama在他的回答中指出的那样,您可以使用
捕获对它的引用auto& t = typeid(float);
答案 2 :(得分:2)
Error C2248 'type_info::type_info': cannot access private member declared in class 'type_info'
此错误消息指的是您type_info
尝试使用auto t = typeid(float);
调用的type_info
的复制构造函数。
但如果我想使用第一个表达式,我该怎么做呢 篡改
type_info
课程并使用朋友来实现我的目标 目的?有什么建议吗?
即使您可以操纵{<1}}的定义,不能,您可能会做什么?复制构造函数不是私有的,因为它需要对您隐藏,但因为该语言没有定义复制type_info
的含义。实际上,即使你以某种方式将成员函数声明为public
(这已经是纯粹的假设),也没有定义,因而也没有链接器错误。
我不知道为什么GCC在这里的错误消息中没有更具体。使用C ++ 11,复制构造函数不只是private
而是已删除,这就是它无法使用的原因。巧合的是,MSVC的错误信息更合适,正如它所说:
error C2280: 'type_info::type_info(const type_info &)' :
attempting to reference a deleted function
解决您问题的现代C ++ 11解决方案是使用std::type_index
,它是std::type_info
周围的可复制包装。这是一个例子:
#include <typeindex>
int main()
{
auto t = std::type_index(typeid(float));
}
答案 3 :(得分:1)
类std::type_info
已删除了复制构造函数。
type_info(const type_info& rhs) = delete; // cannot be copied
^^^^^^^^
另一方面(5.2.8型号识别)
1 typeid表达式的结果是静态类型const std :: type_info(18.7.1)的左值和动态类型const std :: type_info或const name其中name是一个实现 - 公共派生自std :: type_info的定义类,它保留了18.7.1.69中描述的行为左值引用的对象的生命周期延伸到程序的末尾。是否在程序结尾处为std :: type_info对象调用析构函数是未指定的。
所以你可以写例如
#include <iostream>
int main()
{
decltype( auto ) t = typeid( float );
std::cout << t.name() << std::endl;
return 0;
}