2013-05-03 86 views
1

我有這樣一個全局函數:聲明一個模板函數作爲朋友

namespace X 
{ 
namespace Y 
{ 
template <R, ...T> 
R foo(T&&... args) 
{ 
    R r(args...); 
    return r; 
} 
} 
} 

然後在另一個類A,我想聲明這個功能fooA朋友。所以我做:

class A 
{ 
template <R, ...T> 
friend R X::Y::foo(T&&... args); 
A(int x, int y){} 
}; 

現在,當我打電話X::Y::foo<A>(4, 5)它失敗,錯誤來編譯FOO不能訪問的A的私有構造。我無法理解錯誤,我該如何正確地聲明foo作爲A的朋友?

在此先感謝。

+0

這是真碼嗎? – 2013-05-03 14:41:55

+0

嘗試'朋友R X :: Y :: foo (T &&...);'。 – 2013-05-03 14:44:20

+0

這是Visual Studio 2012 CTP中的一個錯誤,將它報告給Microsoft,他們已經在內部修復了它。 – Aarkan 2013-05-30 16:53:46

回答

2

與模板參數和參數組固定的語法問題之後,這似乎工作:

namespace X 
{ 
    namespace Y 
    { 
     template <typename R, typename ...T> 
     R foo(T&&... args) 
     { 
      R r(args...); 
      return r; 
     } 
    } 
} 

class A 
{ 
    template <typename R, typename ...T> 
    friend R X::Y::foo(T&&... args); 
    A(int x, int y){} 
}; 

int main() 
{ 
    X::Y::foo<A>(1, 2); 
} 

這裏是上面的代碼編譯的live example