运营商=的正确签名是什么?

时间:2012-04-26 00:50:11

标签: gcc g++

我已经将我的开发机器更新到刚刚发布的12.04版本的Ubuntu,这显然给了我一个新版本的GCC(4.6.3)。现在用于编译的源代码很好地给了我关于编译器生成的赋值运算符的错误:

source/local.cpp:1185:59: error: no match for ‘operator=’ in ‘olddata = stype::block_t((*(const oc::json_t*)(& local::database_t::getData(const sdata::uuid_t&, size_t*, sdata::override::type_t)((* & uuid), (& otype), (sdata::override::type_t)1u))), 0)’
source/local.cpp:1185:59: note: candidate is:
source/sdata/block.hpp:13:7: note: sdata::block_t& sdata::block_t::operator=(sdata::block_t&)
source/sdata/block.hpp:13:7: note:   no known conversion for argument 1 from ‘sdata::block_t’ to ‘sdata::block_t&’

据我所知,编译器生成的operator=应该有签名foo& operator=(const foo&),而不是foo& operator=(foo&)。这是这个版本的GCC中的错误,还是我的理解错了?我在GCC错误跟踪器上找不到任何对此的引用,我无法相信没有其他人遇到它。

(Google不会轻易搜索包含等号的字词,但有耐心,我找到了对此问题here的单一引用,讨论了GCC 4.6.2。)

2 个答案:

答案 0 :(得分:0)

我做过一次的字符串类的一个例子:

String& String::operator=(const String& other)  {       
    // checking for self-assignment (pointer-compare)       
    if(this != &other) {
        delete[] s_buffer;
        s_length = other.Length();
        s_buffer = new char[s_length+1];
        memcpy(s_buffer,other.c_str(),s_length+1);
    }
    return *this;   
}

答案 1 :(得分:0)

我不知道什么是正确的,但GCC的行为肯定会导致问题。我称之为一个错误。

奇怪的是,似乎每个班级都没有发生,只有少数,所以在我想出一个简单的例子之前,我无法真正提交错误报告。