模板类的朋友模板功能

时间:2013-06-04 16:35:12

标签: c++ templates metaprogramming

如何使用以下代码:

#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不喜欢template<size_t N>声明前面的friend

错误:在主模板朋友MyClass myFun(const std :: array&amp; a);

的声明中无效使用template-id'myFun'

1 个答案:

答案 0 :(得分:2)

您只需将模板的前向声明复制到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 );
};