2009-07-07 72 views
5

noob在這裏仍在嘗試模板。試圖寫一個消息處理類模板C++中的類模板中的模板類

template <typename T> class MessageProcessor { 

    //constructor, destructor defined 
    //Code using t_ and other functions 
foo(void) { 

//More code in a perfectly fine method 
} 
    private: T *t_ 

}; 

所有定義在頭文件中。我已經建立並測試了我的班級,一切都很好。現在,我想這樣做:

template <typename T> class MessageProcesor { 

    //Same stuff as before 

foo(void) { 
//Same code as before in foo, but one new line: 
    t_->getMessageSender<MessageType>(); 

} 

private: T *t_; 
}; 

不過,此行給了我之前「>」令牌壞表達式類型的錯誤。

我已經添加了必要的頭文件來定義MessageType是什麼。我之前很多時候都使用過這個函數,只是不在這個範圍內。

我懷疑編譯器不喜歡模板函數在未定義的類模板(非特定?)內完全定義(專門化?)的事實。我並不完全理解什麼使得模板成爲「專業」。大多數解釋都集中在「全部」或「部分」的概念上,而不是首先使其專業化的原因。

如果您想查看更多代碼,請致歉。我在工作中沒有互聯網接入,這就是我正在做這件事的地方,所以我必須把所有東西都放到我的精神「便箋簿」中,然後帶回家。

+2

在這裏發佈getMessageSender函數代碼。 – 2009-07-07 07:26:53

+0

食物沒有返回類型,那是你的問題 – 2009-07-07 08:40:24

回答

9

你的成員函數「富」需要一個返回類型,你需要的時候,你在依賴表達式(表達式,其含義直接或間接依賴於一個通用模板參數)

t_->template getMessageSender<MessageType>(); // ok 
t_->getMessageSender<MessageType>(); // not ok 
使用成員模板使用關鍵字「模板」

當成員模板需要以'template'關鍵字爲前綴時,這個例子可能會有所幫助[注意:爲了對稱性,您可以在成員模板上始終使用'template'前綴,但它是在非依賴表達式上使用時可選。

struct MyType 
{ 
    template<class T> void foo() { } 
}; 

template<class U> 
struct S 
{ 
    template<class T> 
    void bar() 
    { 
    MyType mt; // non-dependent on any template parameter 
    mt.template foo<int>(); // ok 
    mt.foo<int>(); // also ok 

    // 't' is dependent on template parameter T 
    T t; 
    t.template foo<int>(); // ok 
    t.foo<int>(); // not ok 

    S<T> st; // 'st' is dependent on template parameter T 
    st.template foo<int>(); // ok 
    st.foo<int>(); // not ok 


    S<MyType> s; // non-dependent on any template parameter 
    s.bar<int>(); // ok 
    s.template bar<int>(); // also ok 

    } 

}; 

希望有所幫助。

0

可能,MessageType在這一點上是未知的。你是否缺少包含,命名空間解析或聲明?

如果不行,getMessageSender如何申報,以及MessageType如何申請?

一般來說,在C++中,如果T在這一點上是未知的,那麼這不是一個問題(呃...它很複雜,但仍然)。

此外,錯誤消息通常包含它試圖被檢測的類型。嘗試至少發佈完整的錯誤消息。

0

對於模板化的getMessageSender等方法您還有其他類似的調用嗎?

t_->getMessageSender<MessageType>(); 
2

添加關鍵字template->和模板方法的名稱之間:

t_->template getMessageSender<MessageType>(); 
0

這只是你的函數的返回值類型是不可少的。 t_成員已完全定義。

模板的專業化是您的特定模板參數的「特殊」版本。示例:std::vector是通用std::vector的專用版本。

部分專業化是您的通用代碼的實現,其中並非提供所有模板參數。

0

這適用於Visual Studio 2010編譯器。

class One 
{ 
public: 
    void newFoo() ; 
    template < class T > void foo() 
    { 
     T obj ; // obj is dependent on template parameter 
     obj.newFoo() ; // and this works 
    } 
} 

只是爲了保持答案更新!