相同类型之间的转换无效

时间:2017-01-09 08:20:33

标签: c++ templates vector

我有一个函数,它将向量的元素转换为以逗号分隔的字符串。我希望这个函数适用于数值,如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();
}

2 个答案:

答案 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引用传递参数,这也将避免向量的深层副本。