如何使用朋友访问STL私有成员

时间:2015-10-26 15:20:44

标签: c++ class templates typeid

当我这样做时......

auto t = typeid(float);

......我明白了:

错误C2248'type_info :: type_info':无法访问类'type_info'中声明的私有成员

当然,我知道我可以做到这一点......

auto t = typeid(float).name();

但是如果我想使用第一个表达式,我将如何篡改type_info类并使用朋友来实现我的目标?有什么建议吗?

4 个答案:

答案 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;
}