Почему шаблонная функция не может быть дружественной шаблонной функцией класса шаблона? - PullRequest
2 голосов
/ 09 апреля 2019

Я следил за видеоуроком и хочу объявить функцию шаблона как друга класса шаблона. Я не знаю, почему код выдает ошибку.

template<class T>class C;
template<class T>void doSomething2(T);
template<class T>class C{
    int b;
    friend void doSomething2(T);

};
template<class U>void doSomething2(U u){
    C<U> obj;
    obj.b=100;
}
int main()
{
    C<int> obj;
    int a=44;
    doSomething2(a);
    return 0;
}

и ошибка компилятора.

Ошибка:

templates_friends_38.cpp: В экземпляре «void doSomething2 (T) [с T = int]»: templates_friends_38.cpp: 40: 19: требуется отсюда templates_friends_38.cpp: 32: 9: ошибка: «int C :: b» является конфиденциальной в этом контексте obj.b = 100; ~~~~ ^ templates_friends_38.cpp: 25: 9: примечание: здесь объявлено закрытым int b; ^

Ответы [ 2 ]

4 голосов
/ 09 апреля 2019

Вам нужно добавить <> в объявление друга, чтобы указать, что doSomething2 является функцией шаблона:

template<class T>class C;
template<class T>void doSomething2(T);
template<class T>class C{
    int b;
    friend void doSomething2<>(T);

};
template<class U>void doSomething2(U u){
    C<U> obj;
    obj.b=100;
}
int main()
{
    C<int> obj;
    int a=44;
    doSomething2(a);
    return 0;
}
4 голосов
/ 09 апреля 2019

friend void doSomething2(T);, вы объявляете новую не шаблонную функцию с именем doSomething2 как friend, что не соответствует ожиданиям.

Необходимо указать, что doSomething2 - это шаблон функции, например,

friend void doSomething2<T>(T);
//                      ^^^

Или воспользуйтесь выводом аргумента шаблона и просто напишите

friend void doSomething2<>(T);
//                      ^^

ЖИТЬ

...