need 'typename' before &

2018-09-13  本文已影响31人  LilacZiyun

学习C++时,遇到如下错误:

need 'typename' before 'std::vector<elemType>::iterator' because 
'std::vector<elemType>' is a dependent scope

开始还以为是自己的代码有问题,后面发现《Essential C++》一书中第74页也是这样写的,便深感奇怪,但也寻得几种解决办法,如有遇到类似问题的,可以参见一二。

以如下代码作为示例:

template<typename _T>
_T maxnum(vector<_T> tarr) {
    _T maxres = tarr[0];
    vector<_T>::iterator it = tarr.begin();
    for (; it != tarr.end(); it++) {
        maxres = *it > maxres ? *it : maxres;
    }
    return maxres;
}

解法一:
不采用迭代器,改用遍历操作

template<typename _T>
_T maxnum(vector<_T> tarr) {
    _T maxres = tarr[0];
    for (int i = 0; i < tarr.size(); ++i) {
        maxres = tarr[i] > maxres ? tarr[i] : maxres;
    }
    return maxres;
}

解法二:
将变量设为auto类型,让编译器自己推断变量类型

template<typename _T>
_T maxnum(vector<_T> tarr) {
    _T maxres = tarr[0];
    auto it = tarr.begin();
    for (; it != tarr.end(); it++) {
        maxres = *it > maxres ? *it : maxres;
    }
    return maxres;
}

解法三:
在出错的代码前添加typename关键字

template<typename _T>
_T maxnum(vector<_T> tarr) {
    _T maxres = tarr[0];
    typename vector<_T>::iterator it = tarr.begin();
    for (; it != tarr.end(); it++) {
        maxres = *it > maxres ? *it : maxres;
    }
    return maxres;
}
上一篇 下一篇

猜你喜欢

热点阅读