Друзья и шаблоны классов - PullRequest
0 голосов
/ 10 августа 2010

Как мне скомпилировать приведенный ниже код без изменения состояния данных int?

template<typename U>
void Test(U);

template< class T > 
class B {
    int data;
    public:
    friend void Test<>( T );
};

template<typename U>
void Test(U u) {
    B < int> b1;
    b1.data = 7;
}

int main(int argc, char *argv[])
{
    char i;
    Test(i);
    system("PAUSE");    
    return 0;
}

Приведенный выше код вызывает ошибку компилятора, поскольку b1.data является приватным в Test с U = char.

Ответы [ 2 ]

1 голос
/ 10 августа 2010

Проблема в том, что вы поддерживаете от Test<U> до B<U> (для того же U), но вы пытаетесь получить доступ к внутренним частям B<int> из Test<char> (другого U).

Вероятно, проще всего сделать любого друга-Тестера из любого Б.

0 голосов
/ 10 августа 2010

Это скомпилировано с использованием VS2008.Не уверен, что он соответствует стандарту.

#include <cstdlib>

template<typename U> void Test(U);

template< class T > class B {
    int data;
    public:
    template <typename U >  friend  void Test(U);
};

template<typename U>
void Test(U u){
    B < int> b1;
    b1.data = 7;
    }
int main(int argc, char *argv[])
{
    char i;
    Test(i);
    system("PAUSE");    
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...