读书人

模板中的if语句判断 typeid如何不好

发布时间: 2012-04-05 12:42:40 作者: rapoo

模板中的if语句判断 typeid,怎么不好使
模板中不能用 typeid 吗,我弄了个函数模板,功能是链接字符串使用。
因为C语言提供的链接字符串的函数有个毛病:第一个指针空间必须足够大,才能连接第二个字符串。

下面是我弄的方法,但是if语句好像没起作用

C/C++ code
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;
}
[解决办法]
重载吧。

读书人网 >C++

热点推荐