一个与模板有关的问题

DarkSpy 2001-09-19 07:41:20
#include <iostream.h>
template <class T>
class X
{
struct str
{ char c; };
public:
int i;
};

template <class Y>
class A
{
public:
X<Y>::str p;
};
main ()
{
}

在BC++ 5.02中,无法编译通过,错误信息为:无法存取 X<Y>::str p,我想也是,因为struct是私有的,但是在 BCB 5。0 中却编译通过,在 VC++ 6 也一样,真是无法明白。
但是等我删除了一些与,模板有关的语句后,再编译就无法通过,例如像这样:

class A {
public:
X::str p;
}

谁能告诉我为什么模板就能存取私有结构?这个到底是不是编译器的错误?
...全文
130 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
DarkSpy 2001-09-22
  • 打赏
  • 举报
回复
fancy_kevin 2001-09-20
  • 打赏
  • 举报
回复
我认为在模板并未确定其类型时,VC没有对access进行检查,检查始于类的声明,如果定义
A<int> ta;编译器会指出私有变量不可访问。
Yake 2001-09-20
  • 打赏
  • 举报
回复
gz
gloom 2001-09-20
  • 打赏
  • 举报
回复
模板支持的确并不容易解决,应该是编译器的问题
Xfly 2001-09-20
  • 打赏
  • 举报
回复
struct str怎么是私有的呢,如果没有private或protected关键字则缺省为public
所以BCB5和VC6都能通过,至于BC++5为什么不行我想是因为BC++5太旧了,对模板支持
特性的支持不好
另外我用gnu gcc2.95和2.96都测试通过了
DarkSpy 2001-09-20
  • 打赏
  • 举报
回复
yes
DarkSpy 2001-09-20
  • 打赏
  • 举报
回复
wondful 2001-09-20
  • 打赏
  • 举报
回复
缺省是public吗?是不是反了?缺省是private.
DarkSpy 2001-09-20
  • 打赏
  • 举报
回复
BC++ 3.1 是通过这段代码,为什么到了 BC++ 5 就不通过了,
而到了BC++ 5.5 的时候又通过了。
而这段代码:
#include <iostream>
template <class T>
class X
{
struct str
{ char c; };
void a();
public:
int i;
};
template <class Y>
class A
{
public:
X<Y>::a;
};
main ()
{ }
按照道理说是不会通过的,但是 GCC 却通过了,到底哪家编译器是对的?
ed9er 2001-09-20
  • 打赏
  • 举报
回复
。。。。完全正确

哎,实例化实例化,以前一直记得的,看到这个问题就忘了
fancy_kevin 2001-09-20
  • 打赏
  • 举报
回复
to ed9er:
我不是说改变template里的定义,我是说在生成实体类时,对实体类的access检查,A<int> ta;是定义一个类型为int的实体类,编译不会通过。
ed9er 2001-09-20
  • 打赏
  • 举报
回复
to Xfly:如果你非要说缺省是public的话,可以在前面自己加个private再试试

ed9er 2001-09-20
  • 打赏
  • 举报
回复
一样的,A<int>::str p一样通过,vc6/gcc3

那些STL fans呢?
一有问题就都不见了。。。

ed9er 2001-09-19
  • 打赏
  • 举报
回复
gz
DarkSpy 2001-09-19
  • 打赏
  • 举报
回复
一、应用场景与出发点 同一个系统中,为了解决不同的客户可能需要设计不同的单据打印模板,实现此方法可能是: 1、设计不同的自带RDLC报表文件,根据当前客户加载不同的报表并打印 2、GDI+绘图 和 打印组件 ,不同的客户创建不同的绘图XML格式的模板内容 3、其他第三方组件 主要对比一下前两种方法,第一种方法不好之处在于,不灵活,开发者必须地每个客户制订一个报表,不推荐采用。第二种方法,修改对应的模板内容就可以了, 模板内容可以是Xml文件,也可以是存放在数据库中的Xml格式字符串。推荐采用这种方法。然后这种方法的也有一个棘手问题 :如何让用户快速、方便地设计打印模板,本示例就是为了解决这个问题。 二、实现思路与原理 功能概要:设计一个界面,支持用户自由添加 要打印的项,文本,直线,图片 等,并且可以方便改变打印项的 字体、颜色、粗细、位置,设计时支持效果预览。 技术要点:GDI+绘图、拖动控件、XML解析、自定义控件 三、相关类介绍 绘图工具类:DrawHelper 实现 xml格式模板 与 打印项 之间进行互相转换,在目标画板中绘制 拖动工具类:WinHelper 实现控件的鼠标拖动,键盘移动 自定义控件:用于显示文字的文本框 TextBoxExt、用于显示直线的标签 LabelExt 主窗体代码:用于用户操作,添加,删除,编辑,打印项 详细介绍请参照我的博文:http://de.cel.blog.163.com/blog/static/51451236201472215450939/

15,440

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧