函数模板的简单问题。

codesnail 2012-07-09 08:26:01
cu_test.cpp


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "cu_test.h"

static int test_cnt=0;
static int err_cnt=0;

template<typename T>
void cu_test(const T test,const T correct,
char *const file_name,const int line_cnt)
{
if(test!=correct)
{
const char *str=file_name+strlen(file_name);
while(*str!='\\')
{
str--;
}
str++;
printf("%s的第%d行错误!\n",str,line_cnt);
err_cnt++;
}
test_cnt++;
}

template<>
void cu_test<const char*>(const char *test,const char *correct,
char const *file_name,const int line_cnt)
{
if(strcmp(test,correct)!=0)
{
const char *str=file_name+strlen(file_name);
while(*str!='\\')
{
str--;
}
str++;
printf("%s | line %d error!\n",str,line_cnt);
err_cnt++;
}
test_cnt++;
}



cu_test.h

#ifndef _CU_TEST_H_
#define _CU_TEST_H_

template<typename T>
void cu_test(T test,T correct,const char* file_name,const int line_cnt);

template<>
void cu_test<const char*>(const char *test,const char *correct,
const char *file_name,const int line_cnt);

#define CU_TEST(test,correct) cu_test(test,correct,__FILE__,__LINE__)

extern void CU_INFO();

#endif


main.cpp

#include <stdio.h>
#include <stdlib.h>
#include "cu_test.h"

int main()
{
unsigned short a=1;
unsigned short b=2;
CU_TEST(a,b);
system("pause");
return 0;
}


提示如下错误:

error LNK2019: 无法解析的外部符号 "void __cdecl cu_test<unsigned short>(unsigned short,unsigned short,char const *,int)" (??$cu_test@G@@YAXGGPBDH@Z),该符号在函数 _main 中被引用

我把main函数放到cu_test.cpp中就无错误,请问是我的头文件声明的问题吗?感谢!
...全文
80 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
图灵狗 2012-07-09
  • 打赏
  • 举报
回复
这是个头疼的老问题,楼主可以参考:
http://www.cppblog.com/mymsdn/archive/2009/02/22/74551.aspx
http://topic.csdn.net/u/20071026/15/fad0132c-692a-4c61-8e87-0bfabd0beba4.html
codesnail 2012-07-09
  • 打赏
  • 举报
回复
现在知道了,谢谢ls的。。。结贴了。。。
W170532934 2012-07-09
  • 打赏
  • 举报
回复

#ifndef _CU_TEST_H_
#define _CU_TEST_H_
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
extern void CU_INFO();
static int test_cnt=0;
static int err_cnt=0;

#define CU_TEST(test,correct) cu_test(test,correct,__FILE__,__LINE__)



template<typename T>
void cu_test(const T test,const T correct,
char *const file_name,const int line_cnt)
{
if(test!=correct)
{
const char *str=file_name+strlen(file_name);
while(*str!='\\')
{
str--;
}
str++;
printf("%s的第%d行错误!\n",str,line_cnt);
err_cnt++;
}
test_cnt++;
}

template<const char*>
void cu_test(const char *test,const char *correct,
char const *file_name,const int line_cnt)
{
if(strcmp(test,correct)!=0)
{
const char *str=file_name+strlen(file_name);
while(*str!='\\')
{
str--;
}
str++;
printf("%s | line %d error!\n",str,line_cnt);
err_cnt++;
}
test_cnt++;
}

#endif


头文件该成这样就没有编译错误了。至于逻辑错误楼主自己弄吧
W170532934 2012-07-09
  • 打赏
  • 举报
回复
楼主知道模板是不支持分离编译的么?你把cu_test.cpp里面的函数合并到.h头文件中吧。

64,685

社区成员

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

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