Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;重新定义';名称';使用不同类型的编译器警告_C++ - Fatal编程技术网

C++ C++;重新定义';名称';使用不同类型的编译器警告

C++ C++;重新定义';名称';使用不同类型的编译器警告,c++,C++,当我试图将一个fstream对象从main()传递到另一个类的构造函数进行读取时,为什么编译器抱怨用不同的类型重新定义“reader”?我知道这可能是我做这件事的愚蠢方式,我真的应该有一个字符串作为参数询问文件名,然后将其传递到我在类的构造函数中分配的fstream中。但无论如何,我想知道为什么这不起作用,编译器警告是神秘的 我的主要职能是: fstream reader; reader.open("read.txt"); Markov(reader); Markov.h类中的构造函数: cl

当我试图将一个fstream对象从main()传递到另一个类的构造函数进行读取时,为什么编译器抱怨用不同的类型重新定义“reader”?我知道这可能是我做这件事的愚蠢方式,我真的应该有一个字符串作为参数询问文件名,然后将其传递到我在类的构造函数中分配的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);
}
类马尔可夫{
公众:
/**建造师*/
马尔可夫(流内流){
地图阵列0;
char ch;
while(inStream.good())
{
ch=流内获取();
cout行
Markov(读卡器);
正在创建一个名为
reader
的变量,类型为
Markov
。它相当于以下内容:
Markov reader;
。当然,由于编译器认为您正在声明另一个名为
reader
的变量,它会抛出此错误。要创建
Markov
的实例,请执行以下操作:

Markov m(reader);

这是C++语法中的一个歧义,它总是被当作变量的声明,而不是临时的构造。事实上,你可以在你的声明中的变量名周围有很多你喜欢的括号:<代码>马尔可夫(和)(读者Lo.x)< /C> <>代码>马尔可夫(Reader)当然是一个完美的语法,用于创建一个临时的类型<代码>马尔可夫< /> >,只要它不在一个可以被声明为声明的语句中。例如,如果它在表达式的中间,你就可以了。-6

,不能将其解释为声明

类似地,如果有多个参数被传递给构造函数,
Markov(reader,writer)
,或者如果单个参数不是标识符,
Markov(“foo”)
,则该参数不具有歧义性

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

Markov{reader};
Markov(读卡器);
正在创建一个名为
reader
的变量,类型为
Markov
。它相当于以下内容:
Markov reader;
。当然,由于编译器认为您正在声明另一个名为
reader
的变量,它会抛出此错误。要创建
Markov
的实例,请执行以下操作:

Markov m(reader);

这是C++语法中的一个歧义,它总是被当作变量的声明,而不是临时的构造。事实上,你可以在你的声明中的变量名周围有很多你喜欢的括号:<代码>马尔可夫(和)(读者Lo.x)< /C> <>代码>马尔可夫(Reader)当然是一个完美的语法,用于创建一个临时的类型<代码>马尔可夫< /> >,只要它不在一个可以被声明为声明的语句中。例如,如果它在表达式的中间,你就可以了。-6,不能将其解释为声明

类似地,如果有多个参数被传递给构造函数,
Markov(reader,writer)
,或者如果单个参数不是标识符,
Markov(“foo”)
,则该参数不具有歧义性

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

Markov{reader};

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

Markov(fstream& inStream)

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

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

Markov(fstream& inStream)

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

此外(与此错误无关,但仍然很重要)您的
Markov
构造函数应该引用:
Markov(fstream&inStream)
也(与此错误无关,但仍然很重要)你的<代码>马尔可夫< /COD>构造函数应该引用:<代码>马尔可夫(FStand和InSt流)……我不认为你必须在C++中调用它的构造函数时创建一个类的实例。这正是构造函数所做的,它初始化了一个新的实例。是的,但是“Markov m(Reader)”与“马尔可夫(Reader)”相比。“首先,您可以使用引用(m)来访问类公共函数。如果我使用Markov(“static”);这应该很好,对吗?但是如果我使用'string s=static Markov(s)“这不起作用?”TMLLILLVEIT向我的答案中添加了更多的细节。希望它有帮助。哦……我不认为你必须在C++中调用它的构造函数时创建一个类的实例。这正是构造函数所做的,它初始化了一个新的实例。是的,但是“Markov m(Reader)”与“马尔可夫(Reader)”相比。“首先,您可以使用引用(m)访问类公共函数。如果我使用Markov(“static”);这应该没问题吧?但是如果我使用‘string s=static Markov(s)”,这将不起作用?@TomLilletveit为我的答案添加了更多细节。希望能有所帮助。