C++学习-诡异错误之rank


背景:

修改代码后,出现了很诡异的错误:

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;


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值