我正在学习一个视频教程,我想声明一个模板函数作为模板类的朋友。我不知道为什么代码会抛出错误。
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\u friends\u 38。cpp:在“void doSomething2(T)[T=int]”的实例化中:templates\u friends\u 38。cpp:40:19:此处需要templates\u friends\u 38。cpp:32:9:错误:“int C::b”在此上下文obj中是私有的。b=100;~~~^templates\u friends\u 38。cpp:25:9:注:此处声明私有int b^
friend void doSomething2(T)
,您将一个名为doSomething2的新非模板函数声明为friend,这不是您所期望的函数。
您需要指定doSomething2是一个函数模板,例如。
friend void doSomething2<T>(T);
// ^^^
或者利用模板参数推导,只写
friend void doSomething2<>(T);
// ^^
现场直播
您需要添加
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;
}
我试图使乘法运算符成为名为TVector3的模板类的朋友。我读过,我可以在类声明中声明朋友函数之前,对其进行前向声明,但我这样做的尝试是徒劳的。我知道我可以简单地定义friend函数而不是声明它,但我希望它能与前向声明技术一起工作。 特别是,我试图为我的案例实施这个解决方案。我发现这篇文章也是David Rodriguez给出的解决方案(第三个版本),但我不知道我做错了什么。 我使用'g temp
我想知道如果函数的模板参数包括但不限于类的模板参数,如何使函数成为类的朋友并在类外定义函数。 例如,我有以下模板类和模板朋友函数: 如果我编译: 我会得到以下链接器错误:
考虑以下示例: 我的GCC 9.2.0无法编译并出现以下错误: 但是,工作正常。为什么会这样?如何使用显式模板参数调用foo?
我无法让它工作: 无法编译,错误消息如下: 无效使用temping-id'运算符*
我有一个类模板和一个函数模板定义了一个,它引用要绑定到的模板类型。 我想要的是将< code>make_obj函数声明为< code>friend,这样它可以创建< code>Obj的,但是其他人不能(除了通过copy ctor)。 我尝试了几个朋友声明,包括 和 后者是使< code>make_obj的所有模板实例化成为< code>Obj类的朋友的不太理想的尝试。然而,在这两种情况下,我得到相
我有一个模板,其中有一个friend函数的声明,在类之外,我有它的实现: 在其他文件中的某个地方将其命名为什么签名? 我尝试过: 但它说它无法解决这个问题。为什么?朋友成员应该这样看待,不是吗? 编辑: 这是在Troll.cpp在它的功能。 仍会喊出“未在此范围内声明”、“函数无法解析”、“符号无法解析”、“之前应为主表达式”、“之前应为主表达式”