免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1607 | 回复: 5
打印 上一主题 下一主题

[C++] 模板函数链接问题请教,谢谢。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-11-01 09:08 |只看该作者 |倒序浏览
大家好,模板函数链接问题请教,谢谢。

/////////////////    ex01.h /////////////////////////

#include <iostream>

class TTT
{
public:
        int value ()
        {
                return 10;
        }        
};

class UUU
{
public:
        int value ()
        {
                return 20;
        }        
};

template <typename T, typename U>
void foo (T* t, U* u);

void bar (TTT *t, UUU *u);

/////////////////////////// ex01.cpp //////////////////////////////
#include "ex01.h"
#include <iostream>

template <typename T, typename U>
void foo (T* t, U* u)
{
        std::cout << t->value () << std::endl;
        std::cout << u->value () << std::endl;
}

void bar (TTT* t, UUU* u)
{
        std::cout << t->value () << std::endl;
        std::cout << u->value () << std::endl;
}


//////////////////////////////ex02.cpp ///////////////////////////


#include "ex01.h"

int
main ()
{
    TTT t;
    UUU u;

    foo<TTT, UUU> (&t, &u);
    bar (&t, &u);
}

///////////////////////////////////////////////

$  g++ -c ex01.cpp
$   g++ -o ex02 ex02.cpp ./ex01.o
/tmp/cckpGcvM.o:在函数‘main’中:
ex02.cpp.text+0x17):对‘void foo<TTT, UUU>(TTT*, UUU*)’未定义的引用
collect2: 错误: ld 返回 1

普通函数 bar,可以正常链接,模板函数就出问题,请问这是怎么回事,谢谢。

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
2 [报告]
发表于 2012-11-01 09:38 |只看该作者
ex01.cpp的内容放在.h中,模板不能分离

论坛徽章:
0
3 [报告]
发表于 2012-11-01 11:20 |只看该作者
回复 2# hellioncu

谢谢了,是因为模板函数需要在编译期间进行实例化吧?

我们的使用场景是这样的,大概有1000多个目录,每个目录下的程序都要使用foo函数,为了提高编译速度,我们想把foo做为库函数,其他目录下的程序进行链接,不知道还有没有其他的方法可以加快编译速度。 谢谢。
   

论坛徽章:
0
4 [报告]
发表于 2012-11-01 11:56 |只看该作者
只要你的编译器支持export关键字,就可以进行模板分离编译,从而减少编译时间,但目前支持export的编译器很少,支持得比较好的编译器可选择Comeau C++。

论坛徽章:
0
5 [报告]
发表于 2012-11-01 14:06 |只看该作者
回复 4# supermegaboy


    谢谢楼上的兄弟,学到了一些新知识。

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
6 [报告]
发表于 2012-11-01 14:45 |只看该作者
百度:分离编译........
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP