gpt4 book ai didi

C++ 重新定义 'name' 并出现不同类型的编译器警告

转载 作者:太空宇宙 更新时间:2023-11-04 15:48:05 26 4
gpt4 key购买 nike

当我尝试将 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。它等效于以下内容:马尔可夫阅读器;。当然,由于编译器认为您正在声明另一个名为 reader 的变量,因此会抛出此错误。要创建 Markov 的实例,请执行以下操作:

Markov m(reader);

这是C++语法中的一个歧义,总是被当作变量的声明,而不是临时的构造。事实上,您可以在声明中的变量名称周围添加任意数量的括号:Markov (((((reader)))))

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

同样,如果有多个参数传递给构造函数,Markov(reader, writer),或者如果单个参数不是标识符,Markov("foo"),没有歧义。

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

Markov{reader};

关于C++ 重新定义 'name' 并出现不同类型的编译器警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13421544/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com