繁体   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