2011-04-25 98 views
0

我有这样定义的类:类模板函数签名语法

template< class TBoundingBox > 
class BoundingBoxPlaneCalculator 
{ 
    typedef PlaneSpatialObject<TBoundingBox::PointDimension> PlaneSpatialObjectType; 
    typedef typename PlaneSpatialObjectType::Pointer  PlaneSpatialObjectPointer; 
    std::vector<PlaneSpatialObjectPointer> GetPlanes() const{} 
} 

如果我所说的功能,如:

std::vector<PlaneCalculatorType::PlaneSpatialObjectPointer> planes = planeCalculator->GetPlanes(); 

它工作正常。但是,如果我改变delcaration简单

std::vector<PlaneSpatialObjectPointer> GetPlanes() const; 

,然后尝试定义页眉外的功能:

template< class TBoundingBox > 
std::vector<BoundingBoxPlaneCalculator<TBoundingBox>::PlaneSpatialObjectPointer> 
BoundingBoxPlaneCalculator<TBoundingBox>::GetPlanes() const 
{ 

} 

我得到

itkBoundingBoxPlaneCalculator.txx:61:82: error: type/value mismatch at argument 1 in template parameter list for ‘template<class _Tp, class _Alloc> class std::vector’ 
itkBoundingBoxPlaneCalculator.txx:61:82: error: expected a type, got ‘itk::BoundingBoxPlaneCalculator<TBoundingBox>::PlaneSpatialObjectPointer’ 

我也尝试添加类型名称,但没有变化:

template< class TBoundingBox > 
std::vector<typename BoundingBoxPlaneCalculator<TBoundingBox>::PlaneSpatialObjectPointer> 
BoundingBoxPlaneCalculator<TBoundingBox>::GetPlanes() const 

任何人都可以看到这个语法有什么问题吗?

感谢,

大卫

+2

在这里发帖以减少问题至少是个好主意 - 特别是不要使用很长的名字,尽管它们可能在您的实际应用程序代码中。 – 2011-04-25 18:32:04

+0

什么是'TBoundingBox :: PointDimension'?一种?一个整数?如果它是一种类型,我一直想知道为什么在这之前你不需要'typename' ......并且你在使用什么编译器? – Xeo 2011-04-25 18:37:49

回答

0

它看起来像我不得不调用函数中添加类型名称:

std::vector<typename PlaneCalculatorType::PlaneSpatialObjectPointer> planes = planeCalculator->GetPlanes(); 

我很困惑,为什么它的工作没有它,当函数定义在类内部?

0

我几乎复制粘贴您的代码,但使用的int替换类型,你没有定义,这(使用G ++ 4.4)正常工作对我来说:

#include <vector> 

template<class TBoundingBox> 
class BoundingBoxPlaneCalculator 
{ 
public: 
    typedef int* PlaneSpatialObjectPointer; 
    std::vector<PlaneSpatialObjectPointer> GetPlanes() const; 
}; 

template<class TBoundingBox> 
std::vector<typename BoundingBoxPlaneCalculator<TBoundingBox>::PlaneSpatialObjectPointer> 
    BoundingBoxPlaneCalculator<TBoundingBox>::GetPlanes() const {} 

int main() 
{ 
    BoundingBoxPlaneCalculator<int> planeCalculator; 
    planeCalculator.GetPlanes(); 
} 

问题是,这与您发布的内容看起来并不完全不同,除非您的代码中未声明PlaneSpatialObjectPointer。所以无论是在你的真实代码中有错误还是缺失的部分,或者其他的东西都在进行中。

+0

我正在使用gcc 4.6。我试图将问题简化为一个独立的,可编辑的例子。 – 2011-04-25 18:43:10

+0

我想知道是否在前面添加'typename'可能会有帮助吗?我不知道,我对MSVC并不熟悉,特别是对于这个声称的错误(有链接?)。 – 2011-04-25 18:44:03

+0

忘记我的评论,当PointDimension是一个类型时,OP不使用MSVC,甚至不使用MSVC(2010 atleast)扼流圈。 – Xeo 2011-04-25 18:45:44