2013-06-04 119 views
1

我如何獲得下面的代碼工作:朋友模板函數

錯誤:無效使用模板id的

#include <array> 
#include <iostream> 

template<typename T> 
class MyClass; 

template<typename T, size_t N> 
MyClass<T> myFun(const std::array<T, N>& a); 

template<typename T> 
class MyClass 
{ 
    MyClass(size_t n) 
    { std::cout << "Ctor with n = " << n << '\n'; } 

    template<size_t N> 
    friend MyClass<T> myFun<T, N>(const std::array<T, N>& a); 
}; 


template<typename T, size_t N> 
MyClass<T> myFun(const std::array<T, N>& a) 
{ 
    return MyClass<T>(N); 
} 


int main() 
{ 
    std::array<int, 3> a; 
    myFun(a); 
    return 0; 
} 

GCC不friend聲明的前喜歡template<size_t N> 'myFun'在主模板好友MyClass myFun的聲明中(const std :: array & a);

回答

1

你只需要模板的前瞻性聲明覆制到您的friend聲明:

template<typename T> 
class MyClass 
{ 
    MyClass(size_t n) 
    { std::cout << "Ctor with n = " << n << '\n'; } 

    template<typename T1, size_t N> 
    friend MyClass<T1> myFun(const std::array<T1, N>& a); 
}; 
+0

並且還,在友元函數模板參數DECL要有從類的模板參數不同的名稱。即'T1'與'T' – ipmcc