2011-07-21 44 views
2

可能重複:
Confusing Template error爲什麼我不能從模板函數調用模板類的模板方法

我有一個模板類有一個模板方法。 現在我有另外一個函數,有2個模板參數用第一個模板參數創建類,然後用第二個模板參數調用函數。在上面標註線

error: expected primary-expression before ‘>’ toke 

: 考慮這個例子:

template<class S> 
class A { 
public: 
    template<class T> 
      T f1() { 
        return (T)0.0; 
      } 

}; 

template<class T,class CT> 
void function() { 
    A<T> a; 
    a.f1<CT>(); // gcc error in this line 
} 

GCC紅粉我。爲什麼這不起作用,我該如何解決它? 謝謝! 彌敦道

+0

@ebo:啊謝謝,Johannes的例子更加邪惡,我可以想出任何東西:) –

回答

9

A<T>依賴型(即它取決於模板參數T),所以你必須指定你指的是一個模板成員:

a.template f1<CT>(); 
5

可以,但你需要幫助編譯器。

由於a具有相關類型,因此編譯器無法假定a.f1引用的內容。它可以是一個類型,一個常量,一個函數......無論如何。

由於模板語法使用<,因此很容易與operator<混淆。

因此,該標準要求您消除相關類型內元素的性質。這不僅適用於:

  • 類型,使用的typename,如typedef typename A<T>::SomeType type;
  • 功能,與使用template,如a.template f1<CT>();

它可以說,因爲它是已知CT是一種類型,這種消歧是無意義的,但是當涉及作爲類型參數傳遞的函數時,事情會變得多毛。

例如a.f1<CT()>();可以解釋或者作爲:

  • 比較a.f1和默認使用operator<
  • 呼叫a.f1CT()作爲模板參數

C++的語法構造CT(一次)統一,並要求在所有情況下消除歧義。

質量編譯器會在您可以理解您的構造時向您建議適當的修補程序。