Я следил за видеоуроком и хочу объявить функцию шаблона другом класса шаблона. Я не знаю, почему код выдает ошибку.
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: In instantiation of ‘void doSomething2(T) [with T = int]’: templates_friends_38.cpp:40:19: required from here templates_friends_38.cpp:32:9: error: ‘int C::b’ is private within this context obj.b=100; ~~~~^ templates_friends_38.cpp:25:9: note: declared private here int b; ^
@ Jarod42 Я хотел, чтобы первый был другом. что вы имели в виду под другими функциями?
У вас есть template <class T> class C;
и template<class U>void doSomething2(U)
(где T
и U
могут быть равны или не равны или иметь какое-то другое отношение). Например, doSomething2<int>
может захотеть использовать C<float>
. Поскольку синтаксис будет немного отличаться между этими разными вариантами.
Нет, я предполагал, что они одинаковые.
friend void doSomething2(T);
, вы объявляете новую нешаблонную функцию с именем doSomething2
как friend
, которая отличается от той, которую вы ожидали.
Вам нужно указать, что doSomething2
является шаблоном функции, например.
friend void doSomething2<T>(T);
// ^^^
Или воспользуйтесь выводом аргумента шаблона и просто напишите
friend void doSomething2<>(T);
// ^^
Вам нужно добавить <>
в объявление друга, чтобы указать, что 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;
}
Хочешь, чтобы все
doSomething2<U>
былиfriend
? Или любойdoSomething2<C<U>>
? Или толькоdoSomething2<C<T>>
илиdoSomething2<T>
?