小编Tim*_*mah的帖子

为什么允许此模板代码违反C++的私有访问说明符?

在下面的代码中,我在这里找到:

http://bloglitb.blogspot.com/2010/07/access-to-private-members-thats-easy.html

它似乎跨越了C++的私有访问说明符.它允许我调用私有函数和读/写私有数据成员.

搜索SO发现了这个相关的问题,这是一个确认的GCC编译器错误

c ++模板似乎打破了访问说明符

所以很自然地我尝试使用那个人的测试代码.有趣的是,我的gcc 4.5编译器确实有这个bug(它接受代码并打印私人信息),尽管它在gcc 4.3和我使用4.5中报告.

无论如何,我然后去了Comeau在线编译器,其中一些线程的响应说他们尝试过.我证实科莫接受这个问题的代码,但它确实低于接受我的代码.

所以最终我的问题是,我偶然发现了GCC和Comeau的C++编译器中的错误吗?这是用VC++编译的吗?如果它不是一个bug,有人可以解释它是如何工作的吗?我知道它能够声明一个静态成员函数指针并将其指向私有部分,但它是如何实现的呢?

杂项说明:是的,我知道实际上这样做非常非常糟糕.如果您声明成员数据ptr并允许您读取/写入私有数据,这也将起作用.一些奇怪的评论来自我试图将其标记为理解.我没有想到这个代码,我不相信它.我刚刚在谷歌上找到它.我可能没有足够的声誉点来回复评论,但我会读你所说的一切.谢谢参观.

#include <iostream>

using namespace std;


//--------------------------------------------
//
template<typename Tag>
struct result 
{
  /* export it ... */
  typedef typename Tag::type type;

  static type ptr;
};


// allocate space for the static member
template<typename Tag>
typename result<Tag>::type result<Tag>::ptr;

//--------------------------------------------

template<typename Tag, typename Tag::type p>
struct rob : result<Tag> 
{
  /* fill it ... */
  struct filler 
  {
      filler() { result<Tag>::ptr = p; }
  };

  static …
Run Code Online (Sandbox Code Playgroud)

c++ compiler-construction templates

7
推荐指数
1
解决办法
303
查看次数

标签 统计

c++ ×1

compiler-construction ×1

templates ×1