2014-01-07 33 views
-5

我讀了一些代碼,並看到下面的定義:先進的模板成員使用

你確實需要看代碼,它只是一個代碼段。

我的相關問題只是我使用*什麼*標記,(我每次粗體字,總是不生效時間)

那些類似的使用,這是否意味着:

template <class A> 
class AA { 
    functionBB(A::C c) {} 
} 

我的問題是: 這是否意味着當作者定義這樣的模板時,他知道hw將總是使用具有某些他知道必須具有類成員C的特定類的模板?

template<class **QueryDataT**> 
    class BasicRoutingInterface : boost::noncopyable{ 
    protected: 
     QueryDataT & _queryData; 
    public: 
     BasicRoutingInterface(QueryDataT & qd) : _queryData(qd) { } 
     virtual ~BasicRoutingInterface(){ }; 

    inline void RoutingStep(typename **QueryDataT::QueryHeap** & _forwardHeap, typename QueryDataT::QueryHeap & _backwardHeap, NodeID *middle, int *_upperbound, const int edgeBasedOffset, const bool forwardDirection) const { 
     const NodeID node = _forwardHeap.DeleteMin(); 
      const int distance = _forwardHeap.GetKey(node); 

    .... 
} 
+3

'tempalte'必須是'template'也是你的問題完全缺失'我的問題是:' – deW1

+0

這就是爲什麼你必須絕對注意拼寫。**「定義」只是令人討厭的,但是, 「tempalte」會導致你的程序不能編譯(幸運的是)。 – 2014-01-07 08:56:16

+0

雖然我不明白每個人都能說流利的英語,但這個問題的確措詞很混亂(我沒有倒下,我認爲我理解了它,但它肯定是造成這種情況的原因)。請花點時間,並嘗試澄清這個問題。 –

回答

0

模板可以指期望模板參數作爲參數模板參數的任何構件和任何重載函數(模板參數之外)。這些將在模板實例化時解析。

由於C++語法不明確,模板必須指定是否需要依賴模板參數的標識符引用類型。所以:

template <class A> 
class AA { 
    functionBB(A::C c) {} 
} 

不會下兼容編譯器來編譯,因爲語法顯然希望A::C是一個類型,但它並不標誌着如此。甲typename關鍵字這裏必須

template <class A> 
class AA { 
    functionBB(typename A::C c) {} 
} 

使用(注意,所述typename在較長的示例正確使用上文)。如果沒有typename關鍵字,則預計會涉及價值。

當模板引用參數類型的成員並且它沒有它們時,可能會發生以下兩種情況之一。

  • 如果在SFINAE上下文中找不到該成員,則會忽略模板定義。如果存在模板的另一個定義或非模板重載(在功能的情況下),則使用它們而不會發生錯誤。

  • 在其他任何情況下,編譯器都會發出錯誤。

一個SFINAE上下文,這是模板實例的類型簽名的一部分。這包括其他模板參數的缺省值,類模板的基類型和參數以及函數模板的返回類型。

+0

我認爲你的SFINAE定義是不完整的。如果模板引用了參數類型的成員,並且給定的類型沒有它,那麼**和爲該類型**實例化模板,則編譯器在實例化時發出錯誤。但是這種實例化只有在考慮了(部分)模板專門化和函數重載之後纔會發生。 – MSalters

+0

@ MSalters:你說得對,但是這並不能真正描述那些會導致SFINAE而不會導致SFINAE的上下文。如果模板的_type_語義不正確,則會導致SFINAE。如果身體不是,它會導致錯誤。 –