2015-01-31 59 views
4

我有这段代码与铿锵编译(即使使用-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,和我的铛的版本是3.5.0。 我不明白为什么应该有阴影问题。即使有,它应该已经被叮当拾起。

+0

你能解决影子问题吗?这样两个编译器都快乐吗?还是你说你根本不明白错误信息? – 2015-01-31 18:19:18

+1

这被解释为'PhonebookWriter fname(“Mr Foo Bar”,“12345”)'看起来,即作为本地实例的声明。您可以使用临时或命名工厂函数,或者甚至只是围绕'PhonebookWriter(fname)'的一对括号来解决它。 – 2015-01-31 18:25:43

+0

是的,我可以在这个特定的例子中修复阴影问题。但是,我不明白为什么首先应该存在问题,以及为什么不同的编译器对该代码的反应不同。 – user2535797 2015-01-31 18:26:43

回答

8

变化:

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"); 

现在错误是有道理的。