2012-03-18 125 views
4

我有以下簡化代碼:朋友模板函數

template <class T> 
class A 
{ 
public: 
    template <class U> 
    static U foo(T* p) 
    { 
     p; 
     return U(); 
    } 
}; 

class B 
{ 
    /*template <class T> 
    template <class U> 
    friend U A<T>::foo<U>(T*);*/ 
    friend B A<B>::foo<B>(B*); 
    B() 
    {} 
public: 
}; 
... 
A<B>::foo<B>(nullptr); 

而且它工作得很好。但是,我沒有能夠做到的事情評論說:

/*template <class T> 
template <class U> 
friend U A<T>::foo<U>(T*);*/ 

我不知道語法我應該用什麼做它的工作原理。所以我需要將我的朋友聲明概括爲所有可能的類型。我已經嘗試了不少的語法變體,但沒有成功。有人可以指出我應該寫什麼,而不是使用我的評論代碼來使其有效嗎? 謝謝!

+1

'template '? – Vlad 2012-03-18 13:42:30

+0

我嘗試了幾種不同編譯器的變體,似乎沒有任何工作(並且生成的錯誤消息沒有幫助)。 – Vlad 2012-03-18 14:45:29

+0

我試過你的代碼在叮噹2.8和g ++ 4.5.2的Linux上,並且都很滿意你的代碼... – 2012-03-18 18:27:59

回答

2

什麼你要找的是

template <class T> 
template <class U> 
friend U A<T>::foo(T*); 

上IdeOne.com

以下工作
#include <iostream> 

template <class T> 
class A 
{ 
public: 
    template <class U> 
    static U foo(T* p) 
    { 
    p; 
    return U(); 
    } 
}; 

class B 
{ 
    template <class T> 
    template <class U> 
    friend U A<T>::foo(T*); 

    B() {} 

public: 
    void hello() const 
    { 
    std::cout << "I'm a B!" << std::endl; 
    } 
}; 

int main(int, char*[]) 
{ 
    A<B>::foo<B>(NULL).hello(); 
} 
+0

確實:http://ideone.com/fNVaK。仍然想知道爲什麼模板的語法很模糊,爲什麼'template template '和'template '之間有區別。 – Vlad 2012-03-19 09:38:18

+0

恩,謝謝!但它仍然不能在MSVC2011上編譯。所以現在的問題是:無論是MSVC錯誤還是gcc「擴展」。 – ixSci 2012-03-19 11:35:28

+0

似乎是一個MSVS錯誤,因爲它在come come上成功編譯 – ixSci 2012-03-19 11:39:36

0

我會乾脆不混合行吟詩人評論者,朋友和模板同意,在至少在一系列編譯器中沒有任何一致的方式。該標準可能確切地說應該工作,雖然這可能不會幫助你。悲傷但真實。

無論如何,朋友往往不是一個好主意,不妨考慮如何編寫沒有友誼的代碼,或者使用公共方法的「窮人的朋友」,並註明它不是一般用途。