簡體   English   中英

相同類型之間的轉換無效

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM