[英]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.