2012-04-02 95 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()}; 
}