2011-04-25 97 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