2017-01-09 18 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参考,这也将消除所述载体的深层副本传递参数。