2013-12-18 82 views
4

我試圖將可變數量的流傳遞給接受initializer_list的函數,但似乎不起作用,並從initializer_list結構中拋出所有可能的錯誤,以及有關我的函數與一組ofstreams不能匹配任何已定義的函數。流的初始化列表(C++ 11)

實際上是否可以在initializer_list中傳遞ofstreams的引用?

TEST.CPP

#include "extension.h" 


ofstream outputFile, outputFile2; 

int main(void) { 

    outputFile.open(("data_1.txt"); 
    outputFile2.open("data_2.txt"); 
    writeSomething({outputFile, outputFile2}); 
    outputFile.close(); 
    outputFile2.close(); 
} 

extension.h

#include <stdio.h> 
#include <stdlib.h> 
#include <stdint.h> 
#include <iostream> 
#include <fstream> 
#include <unistd.h> 
#include <string.h> 
#include <initializer_list> 

using namespace std; 

void writeSomething(initializer_list<ofstream&> args); 

extension.cpp

#include "extension.h" 

void writeSomething(initializer_list<ofstream&> args) { 
    for (auto f : args) { 
     f << "hello" << endl; 
    } 
} 
+0

你可以發佈你的代碼? – SubSevn

+0

fstreams不可複製,並且initializer_lists只允許您複製其內容。所以無論它是否有效取決於你如何填充initializer_list以及函數用它做什麼。 IOW,請發佈[SSCCE](http://sscce.org) – Praetorian

+0

發佈我的代碼.. – mercurial

回答

2

鐺3.4(主幹194324)產生一個非常明確的錯誤消息:

initializer_list:54:23: error: 'iterator' declared as a pointer to a reference of type
'std::basic_ofstream<char> &'
typedef const _E* iterator;

所以,不,這是不可能的。另請參閱Error: forming pointer to reference type 'const std::pair&'… I can't understand this error

(GCC 4.7.2,並且由於一些內部編譯器錯誤4.8.1崩潰這個代碼。我已經提交了bugreport

你可以做的反而是傳遞而不是一個參考指針,是這樣的:

#include <fstream> 
#include <initializer_list> 

using namespace std; 

void writeSomething(initializer_list<ofstream*> args) { 
    for (auto f : args) 
     *f << "hello" << endl; 
} 

int main() { 
    ofstream outputFile("data_1.txt"); 
    ofstream outputFile2("data_2.txt"); 
    writeSomething({&outputFile, &outputFile2}); 
} 

不過,我寧願使用std::vector代替。爲此目的使用初始化程序列表對我來說非常奇怪和困惑。