当我尝试将fstream对象从main()传递到另一个类的构造函数以进行读取时,为什么编译器会抱怨redefiniton of 'reader' with a different type?我知道这可能是我的愚蠢方法,我真的应该只用一个字符串作为参数询问文件名,然后将其传递给我在类的构造函数中分配的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);
}

最佳答案

Markov(reader);行正在创建一个reader类型的名为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};

07-24 14:01