64,653
社区成员
发帖
与我相关
我的任务
分享
记住一点,C++类中的友元函数的作用域是全局的,即它是一个全局函数,而不是类的成员,因此,友元函数若要在类外实现,那么它的定义不要跟类联系起来。你的代码中友元模板参数T又是类的模板参数。#include<iostream> using namespace std; template<class T,class U> void func(T&,U&); template<class T>class A; template<class T>class B; template<class T> class A{ T a; public: A(T aa):a(aa) {} template<class X, class Y> friend void func<> (A<X>& aa,B<Y>& bb); }; template<class T> class B{ T b; public: B(T bb):b(bb) {} template<class X, class Y> friend void func<> (A<X>& aa,B<Y>& bb); }; template <class X, class Y> void func<> (A<X>& aa,B<Y>& bb) { cout<<aa.a<<" "<<bb.b<<endl; } int main() { A<int> a(2); B<double> b(3.2); func(a,b); return 0; }
你这是包含编译模型?
#include<iostream>
template <class T, class U> class A;
template <class T, class U> class B;
template <class T, class U> void func(const A<T, U> &a, const B<T, U> &b) {
std::cout << "a.a=" << a.a << " b.b=" << b.b << std::endl;
}
template <class T, class U> class A {
public:
A(T aa) : a(aa) { }
~A(void) { }
private:
T a;
friend void func<T, U>(const A<T, U> &a, const B<T, U> &b);
};
template<class T, class U> class B {
public:
B(T bb) : b(bb) { }
~B(void) { }
private:
T b;
friend void func<T, U>(const A<T, U> &a, const B<T, U> &b);
};
int main(int argc, char *argv[])
{
A<int, double> a(2);
B<int, double> b(3.2);
func(a, b);
return 0;
}
#include<iostream>
using namespace std;
template<class T>class Friendly;
template<class T>void f(const Friendly<T>&);
template<class T>class Friendly{
T t;
public:
Friendly(const T& theT):t(theT) {}
friend void f<>(const Friendly<T>&);
void g(){
f(*this);
}
};
void h(){
f(Friendly<int>(1));
}
template<class T> void f(const Friendly<T>& fo){
cout<<fo.t<<endl;
}
int main(){
h();
Friendly<int>(2).g();
}
里面有一句
friend void f()<>(const Friendly<T>&);
我正式看到这一行才写出了之前的代码。
另外,您的代码我没能在DEV上通过编译。
#include<iostream>
using namespace std;
template<class T,class U>
void func(T&,U&);
template<class T>class A;
template<class T>class B;
template<class T>
class A{
T a;
public:
A(T aa):a(aa) {}
template<class X, class Y>
friend void func<> (A<X>& aa,B<Y>& bb);
};
template<class T>
class B{
T b;
public:
B(T bb):b(bb) {}
template<class X, class Y>
friend void func<> (A<X>& aa,B<Y>& bb);
};
template <class X, class Y>
void func<> (A<X>& aa,B<Y>& bb)
{
cout<<aa.a<<" "<<bb.b<<endl;
}
int main()
{
A<int> a(2);
B<double> b(3.2);
func(a,b);
return 0;
}
谢谢您的代码,但是我还是没能跑出来。 一方面,代码在func(a,b)时发现两个匹配函数,报错: IntelliSense: 有多个 重载函数 "func" 实例与参数列表匹配: 函数模板 "void func(A<int> &aa, B<U> &bb)" 函数模板 "void func(A<U> &aa, B<double> &bb)" 参数类型为: (A<int>, B<double>) 另一方面,由于在B类中又定义了一个func,而这种func版本在实例化之后不会成为A的友元故不能访问aa.a,报错: error C2248: “A<int>::a”: 无法访问 private 成员(在“A<int>”类中声明)
[quote=引用 5 楼 cstdingjw 的回复:] 注意: 1> 函数不支持偏特化, 只支持全特化, 因为函数有重载. 2> 类既可以全特化, 也可以偏特化. 3> 友元函数也不支持偏特化. 以下代码(可以正确运行)供楼主参考:#include<iostream> template <class T, class U> class A; template <class T, class U> class B; template <class T, class U> void func(const A<T, U> &a, const B<T, U> &b) { std::cout << "a.a=" << a.a << " b.b=" << b.b << std::endl; } template <class T, class U> class A { public: A(T aa) : a(aa) { } ~A(void) { } private: T a; friend void func<T, U>(const A<T, U> &a, const B<T, U> &b); }; template<class T, class U> class B { public: B(T bb) : b(bb) { } ~B(void) { } private: T b; friend void func<T, U>(const A<T, U> &a, const B<T, U> &b); }; int main(int argc, char *argv[]) { A<int, double> a(2); B<int, double> b(3.2); func(a, b); return 0; }
#include<iostream>
using namespace std;
template<class T,class U>
void func(T&,U&);
template<class T>class A;
template<class T>class B;
template<class T>
class A{
T a;
public:
A(T aa):a(aa) {}
template<class U>
friend void func<> (A<T>& aa,B<U>& bb);
};
template<class T>
class B{
T b;
public:
B(T bb):b(bb) {}
template<class U>
friend void func<> (A<U>& aa,B<T>& bb)
{
cout<<aa.a<<" "<<bb.b<<endl;
}
};
template<class T,class U>
void func(T& aa,U& bb){
cout<<aa.a<<" "<<bb.b<<endl;
}
int main()
{
A<int> a(2);
B<double> b(3.2);
func(a,b);
return 0;
}
[/quote]
再次感谢您的帮助,经过我的尝试,用您之前的方法可以成功编译了,但只能牺牲友元模板参数与模板类参数之间的关系限制
#include<iostream>
using namespace std;
template<class T>class A;
template<class T>class B;
template<class X, class Y>
void func(A<X>& aa, B<Y>& bb){
cout << aa.a << " " << bb.b << endl;
}
template<class T>
class A{
T a;
public:
A(T aa) :a(aa) {}
template<class X,class Y>
friend void func(A<X>& aa, B<Y>& bb);
};
template<class T>
class B{
T b;
public:
B(T bb) :b(bb) {}
template<class X, class Y>
friend void func(A<X>& aa, B<Y>& bb);
};
int main()
{
A<int> a(2);
B<double> b(3.2);
func(a, b);
return 0;
}
注意: 1> 函数不支持偏特化, 只支持全特化, 因为函数有重载. 2> 类既可以全特化, 也可以偏特化. 3> 友元函数也不支持偏特化. 以下代码(可以正确运行)供楼主参考:#include<iostream> template <class T, class U> class A; template <class T, class U> class B; template <class T, class U> void func(const A<T, U> &a, const B<T, U> &b) { std::cout << "a.a=" << a.a << " b.b=" << b.b << std::endl; } template <class T, class U> class A { public: A(T aa) : a(aa) { } ~A(void) { } private: T a; friend void func<T, U>(const A<T, U> &a, const B<T, U> &b); }; template<class T, class U> class B { public: B(T bb) : b(bb) { } ~B(void) { } private: T b; friend void func<T, U>(const A<T, U> &a, const B<T, U> &b); }; int main(int argc, char *argv[]) { A<int, double> a(2); B<int, double> b(3.2); func(a, b); return 0; }
#include<iostream>
using namespace std;
template<class T,class U>
void func(T&,U&);
template<class T>class A;
template<class T>class B;
template<class T>
class A{
T a;
public:
A(T aa):a(aa) {}
template<class U>
friend void func<> (A<T>& aa,B<U>& bb);
};
template<class T>
class B{
T b;
public:
B(T bb):b(bb) {}
template<class U>
friend void func<> (A<U>& aa,B<T>& bb)
{
cout<<aa.a<<" "<<bb.b<<endl;
}
};
template<class T,class U>
void func(T& aa,U& bb){
cout<<aa.a<<" "<<bb.b<<endl;
}
int main()
{
A<int> a(2);
B<double> b(3.2);
func(a,b);
return 0;
}