BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #28420同步于 2009/9/12
CPP机器人发帖

[合集] 请教一下关于模板类友元函数的问题

shenlei
2009/9/12镜像同步0 回复
☆─────────────────────────────────────☆ 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() : ................... 恩,呵呵,这样确实是可以,总算解决了,哎,不过模板的友元真烦人.. 谢谢啦
订阅后,新回复会通过你的通知中心匿名送达。
0 条回复
暂无回复 · 你可以订阅本帖等待新回复。