背景:
修改代码后,出现了很诡异的错误:
error: type/value mismatch at argument 1 in template parameter list for‘template<class> struct std::rank’ } else if (y->rank < x->rank) { |
解决:
错误中,x和y是两个类对象,rank是类成员,但是为什么会和std::rank扯上关系?搜了一下std::rank的官方说明:http://en.cppreference.com/w/cpp/types/rank
std::rank是一个获取数组维度的模板结构体,使用方法如下:
std::cout << std::rank<int[0][1][2][3]>::value << std::endl;
我们的代码中, rank < x->被当做std::rank < x->处理了,原因是引入了带有using namespace std的头文件;
解决方案主要有:1、去掉using namespace std;2、修改成员变量rank名为其他名字如rankx;3、修改其中的<为>,代码改成x->rank > y->rank;
复现:
#include <iostream>
#include <type_traits>
using namespace std;
template<class T>
bool myfunc1(T* a, T* b) {
if (b->rank > a->rank) {
return true;
} else {
return false;
}
}
//template<class T>
//bool myfunc2(T* a, T* b) {
// if (a->rank < b->rank) {
// return true;
// } else {
// return false;
// }
//}
//template<class T>
//bool myfunc3(T* a, T* b) {
// if ((*a).rank < (*b).rank) {
// return true;
// } else {
// return false;
// }
//}
struct Node {
char rank = 0;
};
int main() {
Node* m1 = new Node;
Node* m2 = new Node;
myfunc1(m1, m2);
std::cout << std::rank<int[0][1][2][3]>::value << std::endl;
}
上述代码中myfunc1是可以正常编译的,myfunc2和myfunc3都不可以编译通过。myfunc2上面解释了,但是myfunc3为什么也不成?猜测是因为编译器预处理时,将(*a).rank解释成了a->rank;