2010-12-16 2 views
0

У меня есть класс специализации шаблона, и мне нужно объявить шаблон функции в качестве друга для этого класса. Я уже создал следующий код, который компилируется и хорошо работает в компиляторе MSVC, но он не работает на компиляторе code-warrior. Чтобы заставить его работать с компилятором codewarrior, я должен раскомментировать явные объявления в классе специализации шаблона.Можно ли создать друга функции шаблона в классе специализации шаблона?

Это проблема с компилятором codewarrior или с некоторыми проблемами с кодом?

Уменьшенный размер кода, чтобы дать контекст:

//template class 
template<class R> 
class Alice 
{ 
    public: 
      Alice() {} 

    private: 
     R review; 

    template< class F> 
    friend void Watch(F, Movie::Wonderland< Alice<R> >&, int); 

}; 

//template specialization class 
template<> 
class Alice<void> 
{ 
    public: 
      Alice() {} 

    private: 
     int review; 

    template<class F> 
    friend void Watch(F, Movie::Wonderland< Alice<void> >&, int); 

    /* 
    //explicit declaration 
    //need to uncomment this to compile on codewarrior 
    //as the function template above doesn't work. 
    friend void Watch<void (*)()>(void (*)(), Movie::Wonderland<Alice<void> > &, int); 
    */ 
}; 

Полный код:

#define ONCE 1 
#define NULL 
namespace Movie{ 
template<class C> 
class Wonderland 
{ 
    public: 
     Wonderland():who(NULL){} 
     Wonderland(C* she):who(she){} 
     void Attach(C *she) 
     {who = she;} 
     C* operator->() 
     {return who;} 
    private: 
     C* who; 
}; 
} 
//fwd declarations 
template<class R> class Alice; 
void Watch(Movie::Wonderland< Alice<void> >& theatre, int price); 
template<class F> void Watch(F func, Movie::Wonderland< Alice<void> >& theatre, int price); 
template<class P, class F> void Watch(F func, P food, Movie::Wonderland< Alice<void> >& theatre, int price); 
struct popcorn; 

template<class R> 
class Alice 
{ 
    public: 
      Alice() {} 

    private: 
     R review; 

    friend void Watch(Movie::Wonderland< Alice<R> >&, int); 

    template< class F> 
    friend void Watch(F, Movie::Wonderland< Alice<R> >&, int); 

    template<class P, class F> 
    friend void Watch(F, P, Movie::Wonderland< Alice<R> >&, int); 
}; 

template<> 
class Alice<void> 
{ 
    public: 
      Alice() {} 

    private: 
     int review; 

    friend void Watch(Movie::Wonderland< Alice<void> >&, int); 

    template<class F> 
    friend void Watch(F, Movie::Wonderland< Alice<void> >&, int); 

    template<class P, class F> 
    friend void Watch(F, P, Movie::Wonderland< Alice<void> >&, int); 

    /* 
    //explicit declarations 
    friend void Watch(Movie::Wonderland<Alice<void> > &, int); 
    friend void Watch<void (*)()>(void (*)(), Movie::Wonderland<Alice<void> > &, int); 
    friend void Watch<void (*)(), void (*)()>(void (*)(), void (*)(), Movie::Wonderland<Alice<void> > &, int); 
    friend void Watch<popcorn, void (*)()>(void (*)(), popcorn, Movie::Wonderland<Alice<void> > &, int); 
    */ 
}; 

//template<class R> 
void Watch(Movie::Wonderland< Alice<void> >& theatre, int price) 
{ 
    theatre.Attach(new Alice<void>); 
    int review = theatre->review; 
    return; 
} 

template<class F> 
void Watch(F func, Movie::Wonderland< Alice<void> >& theatre, int price) 
{ 
    theatre.Attach(new Alice<void>); 
    int review = theatre->review; 
    return; 
} 

template<class P, class F> 
void Watch(F func, P food, Movie::Wonderland< Alice<void> >& theatre, int price) 
{ 
    theatre.Attach(new Alice<void>); 
    int review = theatre->review; 
    return; 
} 

void goWatch(void) 
{ 
    return; 
} 

void eatPopcorn(void) 
{ 
    return; 
} 

struct popcorn 
{ 

}; 

int main() 
{ 
    struct popcorn sweetPopcorn; 
    Movie::Wonderland< Alice<void> > theatre; 
    Watch(goWatch, theatre, ONCE); 
    Watch(goWatch, eatPopcorn, theatre, ONCE); 
    Watch(theatre, ONCE); 
    Watch(goWatch, sweetPopcorn, theatre, ONCE); 
} 
+0

Это минимальный пример? – 2010-12-16 13:52:53

ответ

1

Я просмотрел свой код, и проверили его на двух составителей: г ++ - 4.2 и лязг ++. Я не вижу никаких проблем с вашими объявлениями друзей.

Смежные вопросы