流的初始化器列表(C++11)

4
我正在尝试将可变数量的ofstream传递给一个接受initializer_list的函数,但似乎无法正常工作,并且会抛出关于如何匹配我的函数与任何定义的数组函数以及initializer_list结构的所有可能错误。
实际上,是否可能在initializer_list中传递ofstream的引用? 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;
    }
}

你可以发布你的代码吗? - SubSevn
fstreams不可复制,initializer_list只允许你复制它们的内容。因此,它是否有效取决于您如何填充initializer_list以及函数对其执行的操作。换句话说,请发布SSCCE - Praetorian
1个回答

2

clang 3.4 (trunk 194324)产生了一个非常清晰的错误信息:

initializer_list:54:23: 错误: 'iterator' 声明为指向类型为
'std::basic_ofstream<char> &'
typedef const _E* iterator; 的引用的指针

所以不可能。参见错误:形成指向引用类型“const std::pair&”的指针...我无法理解这个错误.

(gcc 4.7.2和4.8.1会因为一些内部编译器错误而崩溃。我已经提交了一个错误报告。)

相反,您可以传递指针而不是引用,像这样:

#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 对于这个目的使用初始化列表对我来说非常奇怪和令人困惑。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接