2012-10-23 83 views
0

我實現一個模板函數按行讀入文件和類似文件的實體成矢量線:使用ifstream的模板函數有什麼問題?

#include <iostream> 
#include <vector> 
#include <iostream> 
#include <iterator> 
#include <algorithm> 
#include <fstream> 
using namespace std; 
template<typename T> vector<T> readfile(T ref1) 
{ 
    std::vector<T> vec; 
    std::istream_iterator<T> is_i; 
    std::ifstream file(ref1); 
    std::copy(is_i(file), is_i(), std::back_inserter(vec)); 
    return vec; 
} 

我看在主要使用以下代碼讀取文件:

int main() 
{ 
    std::string t{"example.txt"}; 
    std::vector<std::string> a = readfile(t); 
    return 0; 
} 

我得到的錯誤: 「敵不過呼叫「(的std :: istream_iterator,焦炭,...

讓我知道如果我需要提供更多的錯誤信息的機率,我只是搞亂了。有點簡單,但我不能說話d爲什麼 - 使用教程我已經得到了這個,我認爲這是一個很好的解決方案。

+1

你能提供*全*錯誤? –

+0

爲什麼你稱這個函數爲函數模板?這個函數只適用於'std :: string',所以實際上它本身不是函數模板。 – PiotrNycz

回答

5

您顯然希望將is_i轉換爲類型,而是聲明類型爲std_istream_iterator<T>的變量。你大概的意思是寫:

typedef std::istream_iterator<T> is_i; 

你或許應該還解耦用於文件名類型模板參數作爲模板另有相當嚴格:

template <typename T> 
std::vector<T> readfile(std::string const& name) { 
    ... 
} 

std::vector<int> values = readfile<int>("int-values"); 
+0

它正確地做到了我想要的!但我是在假設下std :: istream_iterator 已經是一個類型,而is_i是該類型的變量。我認爲這種類型在所有這一切之前是沒有意義的,哈哈。 – PinkElephantsOnParade

+0

嗯,是的,'std :: istream_iterator '是一種類型,但您嘗試使用此類型的變量創建對象,該變量無效。 –