C++ 代码使用clang编译,但不使用gcc

C++ 代码使用clang编译,但不使用gcc,c++,gcc,clang,C++,Gcc,Clang,我有一段代码,可以用clang(甚至是-Weverything)编译,但是gcc会为其发出一个错误 #include <iostream> #include <vector> #include <fstream> using namespace std; class PhonebookWriter { public: PhonebookWriter(const string& fname): fname_(fname), names_

我有一段代码,可以用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;
}
我的gcc版本是4.9.1,我的clang版本是3.5.0。 我不明白为什么会有阴影问题。即使有,它也应该被叮当声捡起。

改变:

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

解释

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

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

现在这些错误是有意义的。

您能解决阴影问题,使两个编译器都满意吗?或者您是说您根本不理解错误消息?这似乎被解释为
PhonebookWriter fname(“Mr Foo Bar”,“12345”)
,即本地实例的声明。您可以使用一个临时的或命名的工厂函数来解决这个问题,甚至只需在
PhonebookWriter(fname)
上加一对括号就可以了。是的,我可以在这个特定的示例中解决阴影问题。然而,我不明白为什么首先会出现问题,以及为什么不同的编译器对代码的响应不同。我试图首先避免使用临时变量。添加额外的括号就成功了。谢谢。关于潜在问题的线程:
(PhonebookWriter(fname))("Mr Foo Bar","12345")("Mrs Bar Foo","54321");
PhonebookWriter fname ("Mr Foo Bar","12345")("Mrs Bar Foo","54321");