返回信息流看C++ primer16章,课后题16.3要自己对之前的Sales_data对象调用compare函数,由于之前的Sales_data类并没有定义<,因此猜测不能作为实例化模板的参数。
然而,在用之前的代码运行的时候,发现一个问题。
由于之前定义了两个类型转换string()和double(),尽管没有为Sales_data定义operator<,但是还是可以用Sales_data对象作为参数进行比较,通过调试,发现当注释掉double()类型转换后,就不能使用模板了,但是如果不注释的话,似乎隐式使用了类型转换double()
我的问题在于,如果注释掉了double()转换,为什么不会隐式的使用string()类型转换去比较,求大佬解释。[ema1]
```C++
//
//练习16.3
//模板定义
//header.h
template <typename T>
int compare(const T &v1, const T &v2) {
if (v1 < v2) return -1;
if (v2 < v1) return 1;
return 0;
}
//Sales_data.h
struct Sales_data {
public:
Sales_data() = default;
explicit Sales_data(const std::string &s) :bookNo(s) {};
Sales_data(const std::string &s, unsigned n, double p) :bookNo(s), units_sold(n), revenue(n*p) {};
operator std::string() const { return bookNo; }
//若注释掉下面的类型转换,则无法使用函数模板
operator double() const { return revenue; }
private:
std::string bookNo;
unsigned units_sold = 0;
double revenue = 0.0;
};
//main.cpp
#include <iostream>
#include "header.h"
#include "Sales_data.h"
using namespace std;
int main() {
Sales_data s1("dd",3,30), s2("dddd",1,30);
cout << compare(s1, s2) << endl;
return 0;
}
```
这是一条镜像帖。来源:北邮人论坛 / cpp / #97118同步于 2018/1/16
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
【问题】C++ Primer课后题
z1973546
2018/1/16镜像同步18 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
c++已经啥也不懂了。。。
【 在 mushroomboy 的大作中提到: 】
: @yqyqyqyqyqy
: @snow233
: @genkimy