2010-01-10 34 views
1

我在創建非模板類的成員模板函數的特殊實例時遇到了麻煩。我有,例如,A類與模板成員函數F:某些類型的模板函數的C++特例,它是一個模板類本身

class A 
    {public: 
     template <class T> int F (T arg) const; 
     .... 
    } 

,並希望有B型此模板函數F的一個特例:

class B; 
... 
template <> void A::F (B arg) const //GOOD! 

和它完美的作品,直到似乎B本身就是一個模板!

此代碼

template <class T> class B ... 
... 
template <> void A::F (B<T> arg) const //error, T undeclared 

以及

template <class T> class B ... 
... 
template <class T> template <> void A::F (B<T> arg) const //error, too many templates 

給出編譯錯誤。

第二個問題是,如何聲明這個特殊的實例(或整個模板實例)是類B的朋友函數? (即使B不是模板,也不起作用)。

class B 
    {friend template <> void A::F (B arg) const // error 
    // as well as 
    template <> friend void A::F (B arg) const // error 
    } 

有沒有一種方法可以用我要去的方式編寫代碼或者它是不可能的?

回答

1

您正試圖爲函數模板創建部分特化,這是非法的。 可以做的只是簡單地創建一個超載。

要創建一個朋友,你只需要使用正確的語法。

以下編譯沒有錯誤。

template <typename T> 
struct B {}; 

struct A 
{ 
    template <typename T> 
    void F(T arg) const; 

    template <typename T> 
    void F(B<T> arg) const; 

    template <typename T> 
    friend void G(B<T> arg); 

    template <typename T> 
    friend struct B; 
}; 
+0

對不起,我怕我沒有趕上語法,你可以在A類的成員F的例子表明 A級 {模板 INT F(T ARG)const的; } 請成爲B班的朋友! – Nick 2010-01-10 16:38:36

+0

哦,我明白了,你不能將友誼賦予成員函數。你可以把它授予這個班,但是:'朋友班A;'。我已經爲答案添加了一個示例。 – avakar 2010-01-10 16:47:29

+0

非常感謝,我認爲是這樣,也許即使我之前聽說過它,宣佈朋友A級也不是問題,所以我不在乎。但是,我不能創造部分專業化是非常可悲的。 – Nick 2010-01-10 16:55:34