有关函数模板使用的问题。想不通,实在想不通!

whp320 2009-01-02 11:37:47
直接拿代码模型说问题
一、定义一个结构体:

typedef struct _S
{
string sItem;
}S;

二、定义一个函数模板

template<class Type,class CS>
Type Fun(Type a, CS b)
{
return (a + b.sItem);
}

三、主函数中这么写

string a = "string1";
S b;
b.sItem = "string2";
string c = Fun(a, b);
printf("%s\n", c.c_str());

四、编译结果报错如下:
error C2784: “std::reverse_iterator<_RanIt> std::operator +(_Diff,const std::reverse_iterator<_RanIt> &)” : 未能推导出“const std::reverse_iterator<_RanIt> &”(从“std::string”中)的模板参数
d:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\xutility(626) : 参见“std::operator`+'”的声明
d:\MyVisual2003Project\TemplateFunc_Test\TemplateFunc_Test.cpp(43) : 参见对正在编译的函数模板实例化“Type Fun<std::string,S>(Type,CS)”的引用
with
[
Type=std::string,
CS=S
]
d:\MyVisual2003Project\TemplateFunc_Test\TemplateFunc_Test.cpp(54) : error C2784: “std::reverse_iterator<_RanIt> std::operator +(_Diff,const std::reverse_iterator<_RanIt> &)” : 未能推导出“const std::reverse_iterator<_RanIt> &”(从“std::string”中)的模板参数
d:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\xutility(626) : 参见“std::operator`+'”的声明
d:\MyVisual2003Project\TemplateFunc_Test\TemplateFunc_Test.cpp(54) : error C2784: “std::reverse_iterator<_RanIt> std::operator +(_Diff,const std::reverse_iterator<_RanIt> &)” : 未能推导出“const std::reverse_iterator<_RanIt> &”(从“std::string”中)的模板参数
d:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\xutility(626) : 参见“std::operator`+'”的声明
d:\MyVisual2003Project\TemplateFunc_Test\TemplateFunc_Test.cpp(54) : error C3767: “+”的匹配函数不可访问
可能是位于“d:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\atlmfc\include\atlsimpstr.h(618)”的友元函数 : “+”[可以通过参数相关的查找找到]
或位于 “d:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\atlmfc\include\cstringt.h(2013)”的友元函数 : “+”[可以通过参数相关的查找找到]
或位于 “d:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\atlmfc\include\atlsimpstr.h(629)”的友元函数 : “+”[可以通过参数相关的查找找到]
或位于 “d:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\xstring(196)”的友元函数 : “+”[可以通过参数相关的查找找到]
或位于 “d:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\atlmfc\include\cstringt.h(2022)”的友元函数 : “+”[可以通过参数相关的查找找到]
或位于 “d:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\atlmfc\include\atlsimpstr.h(640)”的友元函数 : “+”[可以通过参数相关的查找找到]
或位于 “d:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\atlmfc\include\cstringt.h(2031)”的友元函数 : “+”[可以通过参数相关的查找找到]
或位于 “d:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\xstring(299)”的友元函数 : “+”[可以通过参数相关的查找找到]
或位于 “d:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\atlmfc\include\cstringt.h(2040)”的友元函数 : “+”[可以通过参数相关的查找找到]
或位于 “d:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\atlmfc\include\atlsimpstr.h(618)”的友元函数 : “+”[可以通过参数相关的查找找到]
或位于 “d:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\atlmfc\include\cstringt.h(2050)”的友元函数 : “+”[可以通过参数相关的查找找到]
或位于 “d:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\atlmfc\include\atlsimpstr.h(629)”的友元函数 : “+”[可以通过参数相关的查找找到]
或位于 “d:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\xstring(299)”的
友元函数 : “+”[可以通过参数相关的查找找到]
或位于 “d:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\atlmfc\include\cstringt.h(2060)”的友元函数 : “+”[可以通过参数相关的查找找到]
或位于 “d:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\atlmfc\include\atlsimpstr.h(640)”的友元函数 : “+”[可以通过参数相关的查找找到]
或位于 “d:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\atlmfc\include\cstringt.h(2070)”的友元函数 : “+”[可以通过参数相关的查找找到]
或位于 “d:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\xstring(196)”的友元函数 : “+”[可以通过参数相关的查找找到]
或位于 “d:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\atlmfc\include\cstringt.h(2013)”的友元函数 : “+”[可以通过参数相关的查找找到]
或位于 “d:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\atlmfc\include\cstringt.h(2022)”的友元函数 : “+”[可以通过参数相关的查找找到]
或位于 “d:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\atlmfc\include\cstringt.h(2031)”的友元函数 : “+”[可以通过参数相关的查找找到]
或位于 “d:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\atlmfc\include\cstringt.h(2040)”的友元函数 : “+”[可以通过参数相关的查找找到]
或位于 “d:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\atlmfc\include\cstringt.h(2050)”的友元函数 : “+”[可以通过参数相关的查找找到]
或位于 “d:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\atlmfc\include\cstringt.h(2060)”的友元函数 : “+”[可以通过参数相关的查找找到]
或位于 “d:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\atlmfc\include\atlsimpstr.h(618)”的友元函数 : “+”[可以通过参数相关的查找找到]
或位于 “d:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\atlmfc\include\cstringt.h(2070)”的友元函数 : “+”[可以通过参数相关的查找找到]
或位于 “d:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\atlmfc\include\atlsimpstr.h(629)”的友元函数 : “+”[可以通过参数相关的查找找
到]
或位于 “d:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\atlmfc\include\atlsimpstr.h(640)”的友元函数 : “+”[可以通过参数相关的查找找到]
或位于 “d:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\xstring(299)”的友元函数 : “+”[可以通过参数相关的查找找到]
或位于 “d:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\xstring(196)”的友元函数 : “+”[可以通过参数相关的查找找到]
d:\MyVisual2003Project\TemplateFunc_Test\TemplateFunc_Test.cpp(54) : error C2676: 二进制“+” : “std::string”不定义该运算符或到预定义运算符可接收的类型的转换

五、问题就是,这么写模板可以吗?如果可以,我的问题出在哪里了?请高手帮忙看看。
...全文
107 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
fox000002 2009-01-02
  • 打赏
  • 举报
回复
 string c = Fun<string, S>(a, b);


16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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