类模板和函数模板问题,具有挑战性!有经验和兴趣着进!!!

hawkxjy 2005-04-02 11:18:36
// header.h
#include <iostream>
using namespace std;

template <class T> void counts();

template <class TT>
class HasFriendT
{
private:
TT item;
static int ct;
public:
HasFriendT (const TT& i):item(i) {ct++;}
~HasFriendT () {ct--;}
friend void counts<TT> (); // 1.
};

template <class T>
int HasFriendT<T>::ct=0;

template <class T>
void counts()
{
cout <<"template counts():" << HasFriendT<T>::ct <<endl;
}
// use.cpp
#include "header.h"

int main()
{
counts<int>();
HasFriendT<int> hfi1 (10);
HasFriendT<int> hfi2 (20);
HasFriendT<double> hfd (10.5);
counts<double> ();
counts<int> ();

return 0;
}

按照上述编译,指示标记1.的代码行有错误!!若是改之为friend void counts (); 则编译正常!!

哪个老兄能解释一下??感觉C++标准里第一种写法是正确的牙!怎么会出错呢??

我用的是VC6的编译环境!
...全文
185 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
Panic_1 2005-04-03
  • 打赏
  • 举报
回复
仔细看,然后Try it.
hawkxjy 2005-04-03
  • 打赏
  • 举报
回复
Panic_1(觉觉ing) ,你的程序只是多了个
template <class T>
class Dummy
{

};
可以编译通过吗?解释一下。。。
Panic_1 2005-04-03
  • 打赏
  • 举报
回复
int main()
{
counts( Dummy<int>() ); //这里也可以简化
HasFriendT<int> hfi1 (10);
HasFriendT<int> hfi2 (20);
HasFriendT<double> hfd (10.5);
counts( Dummy<double>() ); //这里也可以简化
counts( Dummy<int>() ); //这里也可以简化
return 0;
}
Panic_1 2005-04-03
  • 打赏
  • 举报
回复
这里注释掉也可以:

template <class TT>
class HasFriendT
{
private:
TT item;
static int ct;
public:
HasFriendT (const TT& i):item(i) {ct++;}
~HasFriendT () {ct--;}
// template <class T> //可以不写这些。
// void counts(Dummy<T> d);
friend void counts(Dummy<TT> d); // 1.
};
Panic_1 2005-04-03
  • 打赏
  • 举报
回复
VC6在模板上有点偷工减料,你得多写点东西强制它干活:

#include <iostream>
using namespace std;

template <class T>
class Dummy
{

};

template <class T>
void counts(Dummy<T> d)
{

cout <<"template counts():" << HasFriendT<T>::ct <<endl;
}

template <class TT>
class HasFriendT
{
private:
TT item;
static int ct;
public:
HasFriendT (const TT& i):item(i) {ct++;}
~HasFriendT () {ct--;}
template <class T>
void counts(Dummy<T> d);
friend void counts<TT>(Dummy<TT> d); // 1.
};

template <class T>
int HasFriendT<T>::ct=0;


// use.cpp
#include "header.h"

int main()
{
counts<int>(Dummy<int>());
HasFriendT<int> hfi1 (10);
HasFriendT<int> hfi2 (20);
HasFriendT<double> hfd (10.5);
counts<double> (Dummy<double>());
counts<int> (Dummy<int>());

return 0;
}
hawkxjy 2005-04-03
  • 打赏
  • 举报
回复
呵呵,没人响应吗???

在VC6里使用模扳时经常出现类似counts<TT>(..)时编译出错而用counts(..)时又没有错误的情况!!到底是怎么一回事?? C++标准里是允许的吧
stevensinclair 2005-04-03
  • 打赏
  • 举报
回复
总有一天我会赶上你的。UPCC。
阅过。
hawkxjy 2005-04-03
  • 打赏
  • 举报
回复
这是C++标准吗?还是VC本身编译器的缺陷???
谁能解释一下原因???
xxxdg 2005-04-03
  • 打赏
  • 举报
回复
楼主的 HasFriend 类模板与counts模板函数的类型参数不一样,一个是TT,一个是T,
如果去掉main()中的第一个count<int>() 调用,在调试的时候竟然会报错,说是counts中未定义类型T

建议楼主将所有类型参数都用一个T,这样就没问题。

不过,在运行后面的程序时,会有点问题。

counts<double>() 和 counts<int>() 输出值相同

但是只单独调用其中一个的话,它们的输出值是不同的。

即,只调用 counts<double> 输出为1 ,
只调用 counts<int> 输出为2。
xxxdg 2005-04-03
  • 打赏
  • 举报
回复
呵呵,没注意后面的,
再去掉后面的<TT>

也就是说前面模板函数怎么声明的,在类中就怎么用。

template <class TT> friend void counts();
xxxdg 2005-04-03
  • 打赏
  • 举报
回复
把友元模板函数写全:

template <class TT>
class HasFriendT
{
// ... others
public:
template <class TT> friend void counts<TT> ();
};
Panic_1 2005-04-03
  • 打赏
  • 举报
回复
参考这篇文章:
http://blog.vckbase.com/panic/archive/2005/04/03/4344.html
Dong 2005-04-03
  • 打赏
  • 举报
回复
#include <iostream>
using namespace std;

//template <class T> void counts();

template <class TT>
class HasFriendT
{
private:
TT item;
static int ct;
public:
HasFriendT (const TT& i):item(i) {ct++;}
~HasFriendT () {ct--;}
template <class T>
friend void counts(); // 1.
};

template <class T>
int HasFriendT<T>::ct=0;

template <class T>
void counts()
{
cout <<"template counts():" << HasFriendT<T>::ct <<endl;
}

int main()
{
counts<int>();
HasFriendT<int> hfi1 (10);
HasFriendT<int> hfi2 (20);
HasFriendT<double> hfd (10.5);
counts<double> ();
counts<int> ();

return 0;
}

HasFriendT<int>与HasFriendT<double>是两个不同的类型,所以在类摸板中的HasFriendT<TT>::ct因为使用int类型与double就有两个不同的ct,他们拥有不同的值的,最后是HasFriendT<int>::ct的值是2,而HasFriendT<double>::ct的值是1。不过编译器好象有个错误,就是所有counts<TT>()返回的HasFriendT<TT>::ct的值,靠的是程序最后一个调用counts<TT>()的值!比如最后是counts<int> ();返回2,最后是counts<int> ();返回1,最后是counts<char> ();返回0


本人在摸板没有下苦工夫,所以很可能自己说的错误
xxxdg 2005-04-03
  • 打赏
  • 举报
回复
呵呵,
不必在一些符号点缀上下功夫.

to 楼主,编译器问题
nodummy 2005-04-02
  • 打赏
  • 举报
回复
玩这个找死,用VC++6玩模板就算本不该死,也成了必死……

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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