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