我看到了与此类似的问题,但是还没有找到解决我问题的解决方案,所以我希望可以得到一些帮助。
我想将一个类作为参数传递给具有模板参数的函数(在此示例中,我只希望其进行编译,因此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<
中使用模板参数是否太笼统?除了使用模板之外,还有其他方法可以使操作员工作吗?
谢谢
答案 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;
}