2013-05-03 89 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