2012-04-02 96 views
1

我想写一个函数,将通用列表转换为矢量,但是,我无法让我的函数编译。这里是我的代码(它位于.h文件中):C++无法返回矢量模板

template <class T> 
inline std::vector<T> list2vector(std::list<T> &l) 
{ 
    std::vector<T> v; 
    v.insert(v.begin(),l.begin(),l.end()); 
    return v; 
} 

任何人都可以指出我在这里错过了什么吗? 编译器错误是:

find_rpeat.cpp:85: error: invalid initialization of non-const reference of type 
?std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >&? 
from a temporary of type 
?std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >? 
+1

也许你需要'常量的std ::函数签名列表'? – arrowd 2012-04-02 07:26:29

+0

这段代码为我编译[http://ideone.com/p3CEt](http://ideone.com/p3CEt) – ks1322 2012-04-02 07:28:11

+0

哇,加了const做了个窍门,你能解释一下为什么这样可行吗? – user788171 2012-04-02 07:28:30

回答

3
std::vector<T> v; 
std::copy(l.begin(),l.end(), std::back_inserter(v)); 
0

有STL中已经通用的变换函数为您服务。尝试

std::transform(l.begin(), l.end(), std::back_inserter(v), Fn);

我看不出有任何理由去写list2vector或别的东西,如果你能做到,使用STL。想想它就像两个“通用”集之间的映射。在你的情况下列表和向量。

1

根据您的意见你的代码是类似的东西,它应该编译:

#include <iostream> 
#include <vector> 
#include <list> 
using namespace std; 

template <class T> 
inline std::vector<T> list2vector(std::list<T> &l) 
{ 
    std::vector<T> v; 
    v.insert(v.begin(),l.begin(),l.end()); 
    return v; 
} 

int main() { 
    list<string> mylist; 
    vector<string> myvector = list2vector(mylist); 
    return 0; 
} 

但为了产生你的错误信息应该是这样的:vector<string>& myvector = list2vector(mylist);(临时对象分配到非const引用)

0

我似乎可以创建并在同一行

std::vector<T> v (l.begin(), l.end()); 

填写载体并在C++ 11是可以做到更短

template <class T> 
inline std::vector<T> list2vector(std::list<T> &l) 
{ 
    return {l.begin(), l.end()}; 
}