2017-01-09 59 views
1

我有一個將矢量元素轉換爲以逗號分隔的字符串的函數。我想這個函數來數值如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 ::矢量< _Ty>' 轉換參數1至 '的std ::矢量< _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(); 
} 
+0

[無法重現](HTTP:/

template <typename T> std::string ConvertToString(const std::vector<T> elements); 

正如已經被其他的答案中提到,你應該通過const引用而不是按值傳遞/ ideone。com/igVWQS)與你發佈的內容(至少使用g ++)...你可能需要展示更多(並告訴我們你正在使用哪個版本的VS)。 – Holt

+5

無法重現與VS2015,VS2013和VS2005 – Danh

+0

@Holt我已更新整個代碼,我不知道什麼是我的錯。 – meJustAndrew

回答

4

當你這樣寫:

std::string ConvertToString(std::vector<std::string> strings); 

... main之前,您聲明函數ConvertToString,需要一個std::vector<std::string>並返回一個std::string,所以當你試圖用std::vector<int>調用它裏面main它顯然不起作用。

編譯器在main中看不到ConvertToString的模板版本,因此它不能調用ConvertToString(std::vector<int>)。改變ConvertToString,以第一次申報:

template <typename T> 
std::string ConvertToString(std::vector<T> const& elements); 
+0

你是對的,我錯過了這個:) – meJustAndrew

0

這是合法的C++ 03所以是一個編譯器錯誤,或者更可能(我敢這樣),一個畸形的例子。 (考慮從int main()構建示例並提交給編譯器供應商)。

幸運的是,解決方法是可用的,無論如何這將是好得多。寫

template <typename T> std::string ConvertToString(const std::vector<T>& elements)

即通過const參考,這也將消除所述載體的深層副本傳遞參數。