gpt4 book ai didi

c++ - 代码可以用 clang 编译,但不能用 gcc 编译

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:23:03 27 4
gpt4 key购买 nike

我有这段代码可以用 clang 编译得很好(即使使用 -Weverything),但是 gcc 会发出错误。

#include <iostream>
#include <vector>
#include <fstream>

using namespace std;

class PhonebookWriter
{
public:

PhonebookWriter(const string& fname):
fname_(fname), names_(), numbers_() {}

PhonebookWriter& operator()(const string& name,
const string& number)
{
names_.push_back(name);
numbers_.push_back(number);
return *this;
}

~PhonebookWriter(void)
{
ofstream f(fname_.c_str());
for(size_t i=0;i<names_.size();++i)
f << names_[i] << " " << numbers_[i] << "\n";
f.close();
}

private:
const string fname_;
vector<string> names_;
vector<string> numbers_;
};

namespace {
void write_guests_data(const string& fname)
{
PhonebookWriter(fname)("Mr Foo Bar","12345")("Mrs Bar Foo","54321");
}
}

int main(void)
{
write_guests_data("phone_book.txt");

return 0;
}

下面是我尝试编译代码时得到的结果:

$ g++ ./test.cpp
./test.cpp: In function ‘void {anonymous}::write_guests_data(const string&)’:
./test.cpp:39:27: error: declaration of ‘PhonebookWriter fname’ shadows a parameter
PhonebookWriter(fname)("Mr Foo Bar","12345")("Mrs Bar Foo","54321");
^
./test.cpp:39:48: error: no matching function for call to ‘PhonebookWriter::PhonebookWriter(const char [11], const char [6])’
PhonebookWriter(fname)("Mr Foo Bar","12345")("Mrs Bar Foo","54321");
^
./test.cpp:39:48: note: candidates are:
./test.cpp:11:3: note: PhonebookWriter::PhonebookWriter(const string&)
PhonebookWriter(const string& fname):
^
./test.cpp:11:3: note: candidate expects 1 argument, 2 provided
./test.cpp:7:7: note: PhonebookWriter::PhonebookWriter(const PhonebookWriter&)
class PhonebookWriter
^
./test.cpp:7:7: note: candidate expects 1 argument, 2 provided
./test.cpp:39:49: error: expected ‘,’ or ‘;’ before ‘(’ token
PhonebookWriter(fname)("Mr Foo Bar","12345")("Mrs Bar Foo","54321");
^

我的gcc版本是4.9.1,clang版本是3.5.0。我不明白为什么甚至应该存在阴影问题。就算有,也应该被clang捡到了。

最佳答案

改变:

PhonebookWriter(fname)("Mr Foo Bar","12345")("Mrs Bar Foo","54321");

到:

(PhonebookWriter(fname))("Mr Foo Bar","12345")("Mrs Bar Foo","54321");

解释

出于某种原因,gcc 删除了 fname 周围的大括号,这会将行变成:

PhonebookWriter fname ("Mr Foo Bar","12345")("Mrs Bar Foo","54321");

现在错误是有道理的。

关于c++ - 代码可以用 clang 编译,但不能用 gcc 编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28254915/

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