BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #84780同步于 2014/12/15
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

[问题]关于模板类的参数列表

canye
2014/12/15镜像同步5 回复
在改一个在VC6.0下编译的程序,有一个部分不知道怎么改能在2013下通过。 template <class L, class T> class Volume { ... friend class Volume < LinearVolume<T>, T > ; friend class Volume < BlockVolume <T>, T > ; inline L::VolIterator GetVolIterator(const Point<uint2> & startPoint = Point<uint2>(0, 0, 0)) { return (m_data.GetVolIterator(startPoint)); }//这个是原来的代码 } 问题出在L::VolIterator,如何定义这个函数的返回值,让他既可以被L调用,也可以被Volume<LinearVolume<T>, T >中的LinearVolume<T>调用以及Volume < BlockVolume <T>, T > 中的 BlockVolume <T>调用?
订阅后,新回复会通过你的通知中心匿名送达。
5 条回复
clangpp机器人#1 · 2014/12/15
inline L::VolIterator GetVolIterator() 试试改为 typename L::VolIterator GetVolIterator() 两个点(你要本来知道就当我没说): 1. 直接在class定义的大括号里写函数实现,编译器会默认给你加上关键字inline,不用你自己写。 2. 在编译器不知道模板L的具体类型时,不知道L::VolIterator是哪一个{嵌套类型, 成员函数, 数据成员},所以会报编译错误,需要加typename告诉编译器这是嵌套类型。
canye机器人#2 · 2014/12/15
【 在 clangpp 的大作中提到: 】 : inline L::VolIterator GetVolIterator() : 试试改为 : typename L::VolIterator GetVolIterator() : ................... 恩,第一次改的时候加了typename,然后提示提示LinearVolume<bool>::VolIterator使用类模板需要模板参数列表,我是感觉这样定义是否对于那两个友元函数有效?
clangpp机器人#3 · 2014/12/15
【 在 canye 的大作中提到: 】 : 恩,第一次改的时候加了typename,然后提示提示LinearVolume<bool>::VolIterator使用类模板需要模板参数列表,我是感觉这样定义是否对于那两个友元函数有效? 1. 我从你的代码里没有看到LinearVolume<bool>,所以你说的错误提示我没法分析。 2. 你没有定义友元函数,你只有两个友元类,友元类里怎么调用这个函数我也没看到,所以没法分析。
canye机器人#4 · 2014/12/15
【 在 clangpp 的大作中提到: 】 : 1. 我从你的代码里没有看到LinearVolume<bool>,所以你说的错误提示我没法分析。 : 2. 你没有定义友元函数,你只有两个友元类,友元类里怎么调用这个函数我也没看到,所以没法分析。 这个是LinearVolIterator.h中的: template <class T> class VolIterator { protected: const Triple<uint4> m_dim; const T & m_background; const uint4 m_yStep; const uint4 m_zStep; const typename std::vector<T>::iterator m_pBaseAddr; typename std::vector<T>::iterator m_pVox; Point<uint2> m_pos; public: VolIterator(const Point<uint2> & point, const Triple<uint4> & dim, const T & background, const typename std::vector<T>::iterator baseAddr) : m_dim(dim), m_background(background), m_yStep(m_dim.m_x), m_zStep(m_dim.m_x*m_dim.m_y), m_pBaseAddr(baseAddr), m_pos(point) { m_pVox = m_pBaseAddr + GetOffset(m_pos); } 对于LinearVolume.h中LinearVolue的定义: public: #include "LinearVolIterator.h" VolIterator<T> GetVolIterator(const Point<uint2> & startPoint = Point<uint2>(0, 0, 0)) { if (!InsideVolume(startPoint)) { const Point<uint2> pos(0, 0, 0); return(VolIterator(pos, m_dimension, m_background, m_pData.begin())); } return(VolIterator(startPoint, m_dimension, m_background, m_pData.begin())); } 对于错误提示error C2955:"LinearVolume<bool>::Volterator":使用类模板需要模板参数列表,找到的位置就是之前加了typename的那行,在代码中应该暂时没有发现LinearVolume<bool>::Volterator的实例。
clangpp机器人#5 · 2014/12/15
从你贴出来的代码看不出毛病。