模板中的if语句判断 typeid,怎么不好使
模板中不能用 typeid 吗,我弄了个函数模板,功能是链接字符串使用。
因为C语言提供的链接字符串的函数有个毛病:第一个指针空间必须足够大,才能连接第二个字符串。
下面是我弄的方法,但是if语句好像没起作用
template <typename T>void ConnectString(T * a, T * b){ if( typeid(T) == typeid(char) ) { char * c = new char[ strlen(a) + strlen(b) + 1 ]; ::ZeroMemory(c, strlen(a) + strlen(b) + 1); strcat(c,a); strcat(c,b); delete [] a; a = new char[strlen(a) + strlen(b) + 1]; ::ZeroMemory(a, strlen(a) + strlen(b) + 1); strcpy(a,c); delete [] c; } else if( typeid(T) == typeid(wchar_t) ) { wchar_t * w = new wchar_t [ wcslen(a) + wcslen(b) + 1 ]; ::ZeroMemory(w, 2 * (wcslen(a) + wcslen(b) + 1) ); wcscat(w,a); wcscat(w,b); delete [] a; a = new wchar_t [wcslen(a) + wcslen(b) + 1]; ::ZeroMemory(a, 2*(wcslen(a) + wcslen(b) + 1) ); wcscpy(w,a); delete [] w; }}CMainWindow::CMainWindow()//继承于 CFrameWnd{ Create(NULL, L"鹏来电脑"); CMenu m; m.LoadMenuW( IDR_MENU1 ); SetMenu(&m); m.Detach(); wchar_t * a= L"aaa"; wchar_t * b=L"bbb"; ConnectString<wchar_t>(a,b); MessageBox(a);}1>------ 已启动生成: 项目: 鹏来电脑, 配置: Debug Win32 ------1>正在编译...1>CMainWindow.cpp1> WINVER not defined. Defaulting to 0x0600 (Windows Vista)1>c:\users\administrator\desktop\鹏来电脑\鹏来电脑\stdafx.h(11) : error C2664: “strlen”: 不能将参数 1 从“wchar_t *”转换为“const char *”1> 与指向的类型无关;转换要求 reinterpret_cast、C 样式转换或函数样式转换1> c:\users\administrator\desktop\鹏来电脑\鹏来电脑\cmainwindow.cpp(26): 参见对正在编译的函数 模板 实例化“void ConnectString<wchar_t>(T *,T *)”的引用1> with1> [1> T=wchar_t1> ]1>c:\users\administrator\desktop\鹏来电脑\鹏来电脑\stdafx.h(11) : error C2664: “strlen”: 不能将参数 1 从“wchar_t *”转换为“const char *”1> 与指向的类型无关;转换要求 reinterpret_cast、C 样式转换或函数样式转换1>c:\users\administrator\desktop\鹏来电脑\鹏来电脑\stdafx.h(12) : error C2664: “strlen”: 不能将参数 1 从“wchar_t *”转换为“const char *”1> 与指向的类型无关;转换要求 reinterpret_cast、C 样式转换或函数样式转换1>c:\users\administrator\desktop\鹏来电脑\鹏来电脑\stdafx.h(12) : error C2664: “strlen”: 不能将参数 1 从“wchar_t *”转换为“const char *”1> 与指向的类型无关;转换要求 reinterpret_cast、C 样式转换或函数样式转换1>c:\users\administrator\desktop\鹏来电脑\鹏来电脑\stdafx.h(13) : error C2664: “strcat”: 不能将参数 2 从“wchar_t *”转换为“const char *”1> 与指向的类型无关;转换要求 reinterpret_cast、C 样式转换或函数样式转换1>c:\users\administrator\desktop\鹏来电脑\鹏来电脑\stdafx.h(14) : error C2664: “strcat”: 不能将参数 2 从“wchar_t *”转换为“const char *”1> 与指向的类型无关;转换要求 reinterpret_cast、C 样式转换或函数样式转换1>c:\users\administrator\desktop\鹏来电脑\鹏来电脑\stdafx.h(17) : error C2664: “strlen”: 不能将参数 1 从“wchar_t *”转换为“const char *”1> 与指向的类型无关;转换要求 reinterpret_cast、C 样式转换或函数样式转换1>c:\users\administrator\desktop\鹏来电脑\鹏来电脑\stdafx.h(17) : error C2664: “strlen”: 不能将参数 1 从“wchar_t *”转换为“const char *”1> 与指向的类型无关;转换要求 reinterpret_cast、C 样式转换或函数样式转换1>c:\users\administrator\desktop\鹏来电脑\鹏来电脑\stdafx.h(17) : error C2440: “=”: 无法从“char *”转换为“wchar_t *”1> 与指向的类型无关;转换要求 reinterpret_cast、C 样式转换或函数样式转换1>c:\users\administrator\desktop\鹏来电脑\鹏来电脑\stdafx.h(18) : error C2664: “strlen”: 不能将参数 1 从“wchar_t *”转换为“const char *”1> 与指向的类型无关;转换要求 reinterpret_cast、C 样式转换或函数样式转换1>c:\users\administrator\desktop\鹏来电脑\鹏来电脑\stdafx.h(18) : error C2664: “strlen”: 不能将参数 1 从“wchar_t *”转换为“const char *”1> 与指向的类型无关;转换要求 reinterpret_cast、C 样式转换或函数样式转换1>c:\users\administrator\desktop\鹏来电脑\鹏来电脑\stdafx.h(19) : error C2664: “strcpy”: 不能将参数 1 从“wchar_t *”转换为“char *”1> 与指向的类型无关;转换要求 reinterpret_cast、C 样式转换或函数样式转换1>生成日志保存在“file://c:\Users\Administrator\Desktop\鹏来电脑\鹏来电脑\Debug\BuildLog.htm”1>鹏来电脑 - 12 个错误,0 个警告========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ========== [解决办法]
你的问题在于你这里传递的参数是wchar_t那么对strlen来说是不能有这个类型的指针参数的。所以提示出错。
[解决办法]
虽然你的想法是根据传递的类型使用不同的函数(strlen或者wcslen)来求字符串长度,但是实际上在编译的时候就确定了类型了。你这里传递的类型是wchar_t*所以编译期就确定了这个错误(strlen不能使用wchar_t*)
[解决办法]
你的 if 判断是在运行时。
而 strlen 对 T 的判断在编译时。
使用模板元很容易就解决了。
[解决办法]
楼主是什么编译器啊
[解决办法]
T* ConnectString(T * a, T * b)
{
if(!a || !b) return NULL;
unsigned int lenA = 0, lenB = 0;
T* tmpA = a;
T* tmpB = b;
while (*(tmpA++)) lenA++;
while (*(tmpB++)) lenB++;
T* c = new T[lenA + lenB + 1];
memset(c, 0x00, sizeof(T)*(lenA + lenB + 1));
tmpA = a;
tmpB = b;
T* tmpC = c;
for(unsigned int i=0; i<lenA; i++) *(tmpC++) = *(tmpA++);
for(unsigned int j = lenA; j < lenA + lenB; j++) (*tmpC++) = *(tmpB++);
return c;
}
[解决办法]
重载吧。