【问题标题】:C++ overide global operator comma gives errorC ++覆盖全局运算符逗号给出错误
【发布时间】:2011-01-25 06:09:02
【问题描述】:

第二个函数给出错误 C2803 http://msdn.microsoft.com/en-us/library/zy7kx46x%28VS.80%29.aspx : 'operator ,' 必须至少有一个类类型的形式参数。有什么线索吗?

template<class T,class A = std::allocator<T>> 
class Sequence : public std::vector<T,A> {
 public:
    Sequence<T,A>& operator,(const T& a) {
        this->push_back(a);
        return *this;
    }
    Sequence<T,A>& operator,(const Sequence<T,A>& a) {
        for(Sequence<T,A>::size_type i=0 ; i<a.size() ; i++) {
            this->push_back(a.at(i));
        }
        return *this;
    }
};

//this works!
template<typename T> 
Sequence<T> operator,(const T& a, const T&b) {
    Sequence<T> seq;
    seq.push_back(a);
    seq.push_back(b);
    return seq;
}

//this gives error C2803!
Sequence<double> operator,(const double& a, const double& b) {
    Sequence<double> seq;
    seq.push_back(a);
    seq.push_back(b);
    return seq;
}

【问题讨论】:

  • 您不能为内置类型重载运算符。而且您反复尝试超载 op 是被误导的 - 这不是灵丹妙药。
  • @Neil,你的 cmets 太棒了。我喜欢他们xD
  • 这是一颗总能射中你脚的灵丹妙药!
  • @neil:如果我使用模板重载运算符会发生什么,所以参数可以是内置类型作为上面的第一个函数?它的编译和工作,它危险吗?
  • @uray:发生的情况是,(1.0,0.0) 使用内置的 operator, 进行双打,而不是您定义的模板。在我的机器上遵循您的代码的更正版本,typeid((1.0,0.0)).name() 是“d”。

标签: c++ operators comma-operator


【解决方案1】:

将其更改为:

Sequence<double> operator,(const Sequence<double>& a, const double& b)
{
    Sequence<double> seq(a);
    seq.push_back(b);
    return seq;
}

或(基于this article):

Sequence<double> operator,(Sequence<double> seq, const double& b)
{
    seq.push_back(b);
    return seq;
}

【讨论】:

    【解决方案2】:

    在 C++ 中,如果运算符的至少一个参数不是自定义类或不是像枚举这样的原始类型,则不能重载运算符。你不能为int 类型重载+,同样你不能为double 类型重载,

    【讨论】:

    • 编译错误是误导。运算符函数可以很好地与两个参数都是枚举。
    猜你喜欢
    • 1970-01-01
    • 2017-07-11
    • 2010-12-16
    • 1970-01-01
    • 1970-01-01
    • 2011-05-31
    • 1970-01-01
    • 1970-01-01
    • 2010-12-26
    相关资源
    最近更新 更多