2013-08-29 39 views
3

我有下面的类,这里是充满它的原型:丢失的运算符=在

class FlowEdge{ 
private: 
    const uint32_t from_; 
    const uint32_t to_; 
    const double capacity_; 
    double flow_; 
public: 
    FlowEdge(); 
    FlowEdge(uint32_t from, uint32_t to, double capacity); 
    uint32_t from() const; 
    uint32_t to() const; 
    uint32_t other(uint32_t vertex) const throw(std::invalid_argument); 
    double getCapacity() const; 
    double getFlow() const; 
    double residualCapacityTo(uint32_t vertex) const throw(std::invalid_argument); 
    void addResidualFlowTo(uint32_t vertex, double delta) throw(std::invalid_argument); 
}; 

我使用这个类作为的std :: deque的元素类型:在另一个类std::deque<FlowEdge>。当我编译我的项目时,我收到一个错误,说我的FlowEdge类没有可用的operator=方法。此方法由编译器默认创建,不是吗?什么可能是一个问题?我没有operator=也没有公开,也没有在受保护的部分。

回答

4

编译器为您生成operator=如果它能够这样做的话由于您在课堂中拥有const成员,因此无法处理您的情况。这样的成员不能被分配给,所以默认的复制分配操作符不会被明确定义。如果你想分配这个类的对象,你必须提供一个自定义的对象,实现它以保留const成员所需的语义。

当然,更简单的替代方法是将capacity_设为非const double。通常,const数据成员仅在非常特定的情况下才有用,而且他们通常比他们的价值更麻烦。

+0

有关默认复制赋值运算符的更多信息,请参见[C++参考](http://en.cppreference.com/w/cpp/language/as_operator)。 –