[英]Invalid conversion between the same types
我有一个函数,可以将向量的元素转换为以逗号分隔的字符串。 我希望此函数适用于int,float或double等数字值,因此我使函数可以接收模板向量:
template <typename T>
std::string ConvertToString(std::vector<T> elements)
{
std::stringstream stream;
for(int i = 0; i < elements.size()-1; i++)
{
stream << elements[i];
stream << ",";
}
stream <<elements[elements.size()-1];
return stream.str();
}
然后,我声明并填充一个向量:
std::vector<int> values;
values.push_back(1);
values.push_back(2);
values.push_back(3);
并尝试调用该函数:
std::string convertedString = ConvertToString(values);
现在在上述功能行的调用中,我收到以下错误:
错误C2664:'ConvertToString':无法将参数1从'std :: vector <_Ty>'转换为'std :: vector <_Ty>'
我不明白为什么会出现此错误,因为提到的类型相同。 有人可以向我解释我哪里出错了,如何使函数调用起作用?
非常感谢你!
编辑:
我正在使用Visual Studio 2012。
我的完整代码是这样的:
#include<string>
#include<iostream>
#include<sstream>
#include<vector>
std::string ConvertToString(std::vector<std::string> strings);
int __cdecl main(int argc, char **argv)
{
std::vector<int> values;
values.push_back(1);
values.push_back(2);
values.push_back(3);
values.push_back(4);
values.push_back(5);
std::string convertedValues = ConvertToString(values); //here the error occurs
return 0;
}
template <typename T>
std::string ConvertToString(const std::vector<T> elements)
{
std::stringstream stream;
for(int i = 0; i < elements.size()-1; i++)
{
stream << elements[i];
stream << ",";
}
stream <<elements[elements.size()-1];
return stream.str();
}
当您编写此代码时:
std::string ConvertToString(std::vector<std::string> strings);
...在main
之前,您要声明一个函数ConvertToString
,该函数采用std::vector<std::string>
并返回std::string
,因此当您尝试在main
内部使用std::vector<int>
调用它时std::vector<int>
显然不起作用。
编译器在main
中看不到ConvertToString
的模板版本,因此无法调用ConvertToString(std::vector<int>)
。 将第一个ConvertToString
声明更改为:
template <typename T>
std::string ConvertToString(const std::vector<T> elements);
正如其他答案已经提到的那样,您应该通过const引用而不是按值传递:
template <typename T>
std::string ConvertToString(std::vector<T> const& elements);
这是有效的C ++ 03,也是编译器错误,或更可能是(格式错误)一个错误的示例。 (考虑从int main()
构建示例并提交给编译器供应商)。
幸运的是,有一个变通办法,无论如何它将是更好的选择。 写
template <typename T> std::string ConvertToString(const std::vector<T>& elements)
即通过const
引用传递参数,这也将消除向量的深层副本。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.