C ++模板与运算符不匹配<

时间:2018-07-06 14:14:54

标签: c++ templates operators operator-keyword

我看到了与此类似的问题,但是还没有找到解决我问题的解决方案,所以我希望可以得到一些帮助。

我想将一个类作为参数传递给具有模板参数的函数(在此示例中,我只希望其进行编译,因此nvm对操作符中的return true来说是没有意义的)。我在以下代码中发现了这种方式:

template<typename T>
class MyClass {
public:
    bool operator>(const T&) const { 
        return true;
    }  

    bool operator<(const T&) const { 
        return true;
    }
};

template<typename T, typename S> 
vector<T> between_interval(T* start, T* end, const S& low, const S& high){
    vector<T> vec;
    for ( ; start != end; start++) {
        if (low < *start && *start < high)
            vec.push_back(* start);
    }
    return vec;
}

int main() {
    double v1[] = {1.23, 4.56, 7.89, -10, 4};
    MyClass<double> k1;
    MyClass<double> k2;
    vector<double> res = between_interval(v1, v1 + 3, k1, k2);
    for (auto x : res)
        cout << x << " ";
        cout << endl;
    } 

我收到以下错误:

u4.cpp: In instantiation of ‘std::vector<T> between_interval(T*, T*, const S&, const S&) [with T = double; S = MyClass<double>]’:
u4.cpp:39:55:   required from here
u4.cpp:28:36: error: no match for ‘operator<’ (operand types are ‘double’ and ‘const MyClass<double>’)
     if (low < *start && *start < high)

我知道现在传递K1和K2没有意义,但是编译器没有提及这一点,它抱怨没有operator<的匹配项,所以我的主要问题是为什么?在operator<中使用模板参数是否太笼统?除了使用模板之外,还有其他方法可以使操作员工作吗?

谢谢

3 个答案:

答案 0 :(得分:4)

使用

template<typename T>
class MyClass {
public:
    bool operator>(const T&) const { 
        return true;
    }  

    bool operator<(const T&) const { 
        return true;
    }
};

MyClass <double> k1;
double d = 4.2;

你可能会做

  • k1 < d
  • k1 > d

可是你

  • d < k1(带有*start < high

您还必须实现该运算符,或更改代码以使用提供的运算符。

答案 1 :(得分:4)

由于您的operator <是成员函数,因此它期望左侧操作数为类类型。对于low < *start来说很好,但是在*start < high中,您有一个double作为左手操作数。

您将需要提供一个以double作为第一个参数的免费函数,或者使您的类可转换为double(或T)。

答案 2 :(得分:2)

成员运算符始终将左操作数用作this,而右操作数用作运算符参数。这意味着您的比较运算符仅在MyClass位于比较左侧时才起作用。快速解决方案是将行if (low < *start && *start < high)更改为if (low < *start && high > *start),以将MyClass实例放在每个比较的左侧。较干净的解决方案是提供免费的运算符,这些运算符的左侧为T,右侧为MyClass<T>。例如:

template<typename T>
bool operator>(const T& p_left, const MyClass<T> & p_right) {
    return p_right < p_left;
}

template<typename T>
bool operator<(const T& p_left, const MyClass<T> & p_right) {
    return p_right > p_left;
}