我有一个函数,它将向量的元素转换为以逗号分隔的字符串。我希望这个函数适用于数值,如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':无法从'std :: vector&lt; _Ty&gt;'转换参数1到'std :: vector&lt; _Ty&gt;'
我不明白为什么我会收到此错误,因为提到的类型是相同的。有人可以解释一下我在哪里错了,我怎么能让函数调用工作?
非常感谢!
修改
我正在使用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();
}
答案 0 :(得分:4)
当你这样写:
std::string ConvertToString(std::vector<std::string> strings);
...在main
之前,您宣布一个ConvertToString
函数需要std::vector<std::string>
并返回std::string
,所以当您尝试在main
内调用它时1}} std::vector<int>
显然不起作用。
编译器在ConvertToString
中看不到main
的模板化版本,因此无法调用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);
答案 1 :(得分:0)
这是有效的C ++ 03,因此是一个编译器错误,或者更可能(我敢于),一个格式错误的例子。 (考虑从int main()
构建一个示例并提交给编译器供应商)。
幸运的是,有一种解决方法,无论如何都会好得多。写
template <typename T>
std::string ConvertToString(const std::vector<T>& elements)
即。通过const
引用传递参数,这也将避免向量的深层副本。