有关函数模板使用的问题。想不通,实在想不通!
直接拿代码模型说问题
一、定义一个结构体:
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”不定义该运算符或到预定义运算符可接收的类型的转换
五、问题就是,这么写模板可以吗?如果可以,我的问题出在哪里了?请高手帮忙看看。