0

redefiniton of 'reader' with a different type当我尝试将 fstream 对象从 main() 传递到另一个类的构造函数以供读取时,为什么编译器会抱怨?我知道这可能是我愚蠢的做法,我真的应该只使用一个字符串作为参数来询问文件名,然后将它传递到我在类的构造函数中分配的 fstream 中。但无论如何我想知道为什么这不起作用,编译器警告是神秘的。

我的主要功能:

fstream reader;
reader.open("read.txt");
Markov(reader);

Markov.h 类中的构造函数:

class Markov {
public:
/** Constructor */
    Markov(fstream inStream) {
    Map<string, Vector<string> > array0;

    char ch;
    while (inStream.good())
    {
        ch = inStream.get();
        cout << ch << endl;
    }
    cout << "End: " << ch;

    order0(array0);
}
4

2 回答 2

4

该行Markov(reader);正在创建一个名为readertype的变量Markov。它相当于以下内容:Markov reader;. 当然,由于编译器认为您正在声明另一个名为 的变量reader,因此会引发此错误。要创建 的实例Markov,请执行以下操作:

Markov m(reader);

这是 C++ 语法中的歧义,它总是被视为变量的声明,而不是临时的构造。事实上,您可以在声明中的变量名周围有任意数量的括号:Markov (((((reader))))).

Markov(reader)当然,它是创建临时类型的完美语法Markov,只要它不在可以被解析为声明的语句中。例如,如果它在一个表达式的中间,你会没事的。在人为的表达式something += Markov(reader) - 6中,它不能被解释为声明。

同样,如果有多个参数被传递给构造函数Markov(reader, writer),或者如果单个参数不是标识符,Markov("foo")则它不是模棱两可的。

如果您使用的是 C++11 编译器,您确实可以使用新的初始化语法创建一个使用单个参数标识符的临时(尽管我认为没有理由这样做):

Markov{reader};
于 2012-11-16T17:35:37.927 回答
2

您可能希望fstream通过引用传递它。

Markov(fstream& inStream)

当您使用它时,如果您仅将其用于输入服务,请改用 an ifstream&

于 2012-11-16T17:37:40.807 回答