返回信息流在改一个在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>调用?
这是一条镜像帖。来源:北邮人论坛 / cpp / #84780同步于 2014/12/15
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
[问题]关于模板类的参数列表
canye
2014/12/15镜像同步5 回复
订阅后,新回复会通过你的通知中心匿名送达。
5 条回复
inline L::VolIterator GetVolIterator()
试试改为
typename L::VolIterator GetVolIterator()
两个点(你要本来知道就当我没说):
1. 直接在class定义的大括号里写函数实现,编译器会默认给你加上关键字inline,不用你自己写。
2. 在编译器不知道模板L的具体类型时,不知道L::VolIterator是哪一个{嵌套类型, 成员函数, 数据成员},所以会报编译错误,需要加typename告诉编译器这是嵌套类型。
【 在 clangpp 的大作中提到: 】
: inline L::VolIterator GetVolIterator()
: 试试改为
: typename L::VolIterator GetVolIterator()
: ...................
恩,第一次改的时候加了typename,然后提示提示LinearVolume<bool>::VolIterator使用类模板需要模板参数列表,我是感觉这样定义是否对于那两个友元函数有效?
【 在 canye 的大作中提到: 】
: 恩,第一次改的时候加了typename,然后提示提示LinearVolume<bool>::VolIterator使用类模板需要模板参数列表,我是感觉这样定义是否对于那两个友元函数有效?
1. 我从你的代码里没有看到LinearVolume<bool>,所以你说的错误提示我没法分析。
2. 你没有定义友元函数,你只有两个友元类,友元类里怎么调用这个函数我也没看到,所以没法分析。
【 在 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的实例。