2016-04-28 10 views
2

Я на самом деле пытаюсь заставить один класс шаблонов быть другом с другим классом шаблона. Нечто подобное:Friend && Template

#include <iostream> 

template < typename T > 
class Test1 { 

    private: 
    static int wantToBeFriend; 
}; 

template < typename T > 
int Test1<T>::wantToBeFriend = 1; 


template < typename T > 
class Test2 { 

    friend class Test1<T>; 

    public: 
    void run() { 

     std::cout << Test1<T>::wantToBeFriend << std::endl; 
    } 
}; 

int main() 
{ 
    Test1<int> test1; 
    Test2<int> test2; 

    test2.run(); 
    return 0; 
} 

Но я не в состоянии сделать это, НКУ сказать, что int Test1<T>::wantToBeFriend is private. Кто-нибудь знает, как это достичь?

Благодаря

+0

Друзья объявлены в * * дающий дружбы; а не приемником. – WhozCraig

+0

Извините ... Думаю, я слишком много работаю. Я удаляю этот, спасибо в любом случае! –

ответ

3

Дружба не работает так, как вы пытаетесь заставить его работать. Если у вас есть

friend class Test1<T>; 

Это означает, что Test1<T> может получить доступ к закрытым членам Test2<T>. Он не позволяет Test2<T> доступа к частным лицам Test1<T>. Если бы это было так, не было бы смысла иметь частных членов, так как вы могли бы просто сделать себя другом класса и получить к ним доступ.

Если мы включаем его вокруг как

template < typename T > 
class Test2; 

template < typename T > 
class Test1 { 
    friend class Test2<T>; 

    private: 
    static int wantToBeFriend; 
}; 

Затем код компилироваться как сейчас Test2<T> может получить доступ к закрытым членам (Live Example).

+0

Я собирался удалить этот, но тогда я приму свой ответ. Благодаря! –

+0

@MathieuVanNevel Нет проблем. Пожалуйста. – NathanOliver

1

Вам нужно сделать это наоборот. Test1 должен объявить Test2 как друга класса:

#include <iostream> 

template <typename T> class Test2; 

template < typename T > 
class Test1 { 
    template <typename U> friend class Test2; 
    private: 
    static int wantToBeFriend; 
}; 

template < typename T > 
int Test1<T>::wantToBeFriend = 1; 


template < typename T > 
class Test2 { 

    public: 
    void run() { 

     std::cout << Test1<T>::wantToBeFriend << std::endl; 
    } 
}; 

int main() 
{ 
// Test1<int> test1; 
    Test2<int> test2; 

    test2.run(); 
    return 0; 
} 

Live Demo

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

  • Нет связанных вопросов^_^