返回信息流☆─────────────────────────────────────☆
visualbupt (思齐) 于 (Thu Apr 2 20:54:59 2009) 提到:
----------TestTemplate.h-------
#ifndef UTEMPLATE
#define UTEMPLATE
#include "stdafx.h"
template<typename Type>
class TestTemplate
{
friend void wocaonimei();
friend void myfriendfunc();
public:
void printhello();
public:
static Type st;
};
#endif
--------TestTemplate.cpp
#include "stdafx.h"
#include "TestTemplate.h"
template<typename T> void TestTemplate<T>::printhello()
{
cout<<"hello world"<<endl;
}
template<typename T> T TestTemplate<T>::st;
void myfriendfunc()
{
cout<<"hha"<<endl;
}
------------------main-----------
#include "stdafx.h"
#include "TestTemplate.h"
int _tmain(int argc, _TCHAR* argv[])
{
myfriendfunc();
system("pause");
return 0;
}
出现的错误如下:Error 1 error C3861: 'myfriendfunc': identifier not found
为什么会出现这样的错误啊,谁来帮我解决一下?
☆─────────────────────────────────────☆
DarkIce ( ) 于 (Thu Apr 2 20:56:25 2009) 提到:
头文件里面先声明一下试试
【 在 visualbupt (思齐) 的大作中提到: 】
: ----------TestTemplate.h-------
: #ifndef UTEMPLATE
: #define UTEMPLATE
: ...................
☆─────────────────────────────────────☆
visualbupt (思齐) 于 (Thu Apr 2 20:58:13 2009) 提到:
【 在 DarkIce 的大作中提到: 】
: 头文件里面先声明一下试试
我试过,在头文件的前面加了它的声明,就能编译通过,但是对于友元,不是不用在头文件的最签名声明的吗?
这个想不明白了
☆─────────────────────────────────────☆
DarkIce ( ) 于 (Thu Apr 2 21:00:15 2009) 提到:
这个不清楚,不过编译器的报错显然是没有声明
【 在 visualbupt (思齐) 的大作中提到: 】
: 我试过,在头文件的前面加了它的声明,就能编译通过,但是对于友元,不是不用在头文件的最签名声明的吗?
: 这个想不明白了
☆─────────────────────────────────────☆
AHbupt (Peter喜欢Caroline) 于 (Thu Apr 2 21:07:05 2009) 提到:
[size=4][size=4]
【 在 visualbupt 的大作中提到: 】
: ----------TestTemplate.h-------
: #ifndef UTEMPLATE
: #define UTEMPLATE
: ...................
#ifndef UTEMPLATE
#define UTEMPLATE
#include "stdafx.h"
void myfriendfunc();
template<typename Type>
class TestTemplate
{
friend void wocaonimei();
friend void myfriendfunc();
public:
void printhello();
public:
static Type st;
};
#endif
申明一下就可以了吧
☆─────────────────────────────────────☆
shenlei (我爱果子|[路]|天山南北|潇湘隐士) 于 (Thu Apr 2 21:08:37 2009) 提到:
书上写错了或者编译器的问题?
【 在 visualbupt (思齐) 的大作中提到: 】
: 我试过,在头文件的前面加了它的声明,就能编译通过,但是对于友元,不是不用在头文件的最签名声明的吗?
: 这个想不明白了
☆─────────────────────────────────────☆
visualbupt (思齐) 于 (Thu Apr 2 21:15:44 2009) 提到:
【 在 AHbupt 的大作中提到: 】
: [size=4][size=4]
: #ifndef UTEMPLATE
: #define UTEMPLATE
: ...................
恩,你这个确实可以,这个我也试过了,但是普通类的友元不用这样啊,而且对于友元的声明,它的作用域不是被自动扩展了吗?为什么还要这么做呢?
☆─────────────────────────────────────☆
dafei (嘿嘿大飞) 于 (Thu Apr 2 22:21:15 2009) 提到:
尝试解答一下,为什么4楼声明一下就能用,原因就是你只能引用之前声明过的函数,为什么4楼的能用,原因就是声明来该函数的原型,但是没用定义,而定义则是发生在TestTemplate.cpp中,所以先声明原型后在调用才是正确的,正如该函数与main()写在一个文件中一样,要是没有声明就调用这是错误的!应为编译器是按照main()函数中的代码顺序来编译文件的。
☆─────────────────────────────────────☆
fox1987 (王子的狐狸§邪恶VS天真) 于 (Thu Apr 2 22:46:53 2009) 提到:
【 在 dafei 的大作中提到: 】
: 尝试解答一下,为什么4楼声明一下就能用,原因就是你只能引用之前声明过的函数,为什么4楼的能用,原因就是声明来该函数的原型,但是没用定义,而定义则是发生在TestTemplate.cpp中,所以先声明原型后在调用才是正确的,正如该函数与main()写在一个文件中一样,要是没有声明就调用这是错误的!应为编译器是按照main()函数中的代码顺序来编译文件的。
哇 大牛啊
☆─────────────────────────────────────☆
cymvp (cymvp) 于 (Thu Apr 2 22:47:12 2009) 提到:
这个是在哪里看到的?
你这里声明的友元函数只是个普通函数,c++不像c,在调用位置之前没有看到声明,是编译不过去的,而c则可以
【 在 visualbupt 的大作中提到: 】
: 恩,你这个确实可以,这个我也试过了,但是普通类的友元不用这样啊,而且对于友元的声明,它的作用域不是被自动扩展了吗?为什么还要这么做呢?
☆─────────────────────────────────────☆
DarkIce ( ) 于 (Thu Apr 2 22:49:40 2009) 提到:
我怎么记得C也不行
【 在 cymvp (cymvp) 的大作中提到: 】
: 这个是在哪里看到的?
: 你这里声明的友元函数只是个普通函数,c++不像c,在调用位置之前没有看到声明,是编译不过去的,而c则可以
☆─────────────────────────────────────☆
Jarod (学五608鬼魂) 于 (Thu Apr 2 23:25:44 2009) 提到:
RE
【 在 DarkIce 的大作中提到: 】
: 我怎么记得C也不行
☆─────────────────────────────────────☆
visualbupt (思齐) 于 (Fri Apr 3 08:54:50 2009) 提到:
【 在 cymvp 的大作中提到: 】
: 这个是在哪里看到的?
: 你这里声明的友元函数只是个普通函数,c++不像c,在调用位置之前没有看到声明,是编译不过去的,而c则可以
C++ Primer第四版 398页有,而且看下面的代码是没问题的
--------------MC.h----------------
#include "stdafx.h"
class MC
{
friend void printh();
};
----------MC.cpp----------------
#include "stdafx.h"
#include "MC.h"
void printh()
{
cout<<"printh"<<endl;
}
----------main-------------------
#include "stdafx.h"
#include "MC.h"
int _tmain(int argc, _TCHAR* argv[])
{
printh();
system("pause");
return 0;
}
上面这个是正确的
☆─────────────────────────────────────☆
cymvp (cymvp) 于 (Fri Apr 3 10:42:20 2009) 提到:
不过一些编译器确实可以通过
【 在 DarkIce 的大作中提到: 】
: 我怎么记得C也不行
☆─────────────────────────────────────☆
dafei (嘿嘿大飞) 于 (Fri Apr 3 10:45:46 2009) 提到:
#include "stdafx.h"
#include "TestTemplate.h"
int _tmain(int argc, _TCHAR* argv[])
{
TestTemplate<std::string>st;
myfriendfunc();
system("pause");
return 0;
}
添加一个实例就行了!
模板类不能单独编译!
☆─────────────────────────────────────☆
visualbupt (思齐) 于 (Fri Apr 3 10:46:10 2009) 提到:
【 在 cymvp 的大作中提到: 】
: 不过一些编译器确实可以通过
哎,DEV C++和Visual Studio2008都试过了,这是没问题的
☆─────────────────────────────────────☆
visualbupt (思齐) 于 (Fri Apr 3 10:47:35 2009) 提到:
【 在 dafei 的大作中提到: 】
: #include "stdafx.h"
: #include "TestTemplate.h"
:
: ...................
恩,正解,刚才查了,貌似网上有人这么说
☆─────────────────────────────────────☆
cymvp (cymvp) 于 (Fri Apr 3 12:56:12 2009) 提到:
如果友元函数是模板函数,可以使用显示实例化: template void func<类型>(参数);
☆─────────────────────────────────────☆
visualbupt (思齐) 于 (Fri Apr 3 13:04:06 2009) 提到:
【 在 cymvp 的大作中提到: 】
: 如果友元函数是模板函数,可以使用显示实例化: template void func<类型>(参数);
我没太懂你的意思?能再解释下吗?
☆─────────────────────────────────────☆
cymvp (cymvp) 于 (Fri Apr 3 13:34:03 2009) 提到:
在main.cpp中显式实例化类模板:
template class TestTemplate<int>; //显式实例化类模板
int main()
{
myfriendfunc();
return 0;
}
这样也可以。
【 在 visualbupt 的大作中提到: 】
: 我没太懂你的意思?能再解释下吗?
☆─────────────────────────────────────☆
visualbupt (思齐) 于 (Fri Apr 3 15:27:16 2009) 提到:
【 在 cymvp 的大作中提到: 】
: 在main.cpp中显式实例化类模板:
: template class TestTemplate<int>; //显式实例化类模板
: int main()
: ...................
恩,呵呵,这样确实是可以,总算解决了,哎,不过模板的友元真烦人..
谢谢啦
这是一条镜像帖。来源:北邮人论坛 / cpp / #28420同步于 2009/9/12
CPP机器人发帖
[合集] 请教一下关于模板类友元函数的问题
shenlei
2009/9/12镜像同步0 回复
订阅后,新回复会通过你的通知中心匿名送达。
0 条回复
暂无回复 · 你可以订阅本帖等待新回复。