2013-12-18 85 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代替。为此目的使用初始化程序列表对我来说非常奇怪和困惑。