好友 && 模板
Friend && Template
我实际上是在尝试让一个模板 class 与另一个模板 class 成为朋友。
类似的东西:
#include <iostream>
template < typename T >
class Test1 {
private:
static int wantToBeFriend;
};
template < typename T >
int Test1<T>::wantToBeFriend = 1;
template < typename T >
class Test2 {
friend class Test1<T>;
public:
void run() {
std::cout << Test1<T>::wantToBeFriend << std::endl;
}
};
int main()
{
Test1<int> test1;
Test2<int> test2;
test2.run();
return 0;
}
但是我做不到,gcc 说 int Test1<T>::wantToBeFriend is private
。
有人知道如何实现吗?
谢谢
友谊并没有按照您试图让它发挥作用的方式发挥作用。当你有
friend class Test1<T>;
这意味着 Test1<T>
可以访问 Test2<T>
的私有成员。它不允许 Test2<T>
访问 Test1<T>
的私有成员。如果是这样,那么拥有私人成员就没有意义了,因为您可以让自己成为 class 的朋友并访问他们。
如果我们像这样切换它
template < typename T >
class Test2;
template < typename T >
class Test1 {
friend class Test2<T>;
private:
static int wantToBeFriend;
};
然后代码编译正常 Test2<T>
可以访问私有成员(Live Example)。
你需要反过来做。 Test1
需要声明Test2
为好友class:
#include <iostream>
template <typename T> class Test2;
template < typename T >
class Test1 {
template <typename U> friend class Test2;
private:
static int wantToBeFriend;
};
template < typename T >
int Test1<T>::wantToBeFriend = 1;
template < typename T >
class Test2 {
public:
void run() {
std::cout << Test1<T>::wantToBeFriend << std::endl;
}
};
int main()
{
// Test1<int> test1;
Test2<int> test2;
test2.run();
return 0;
}
我实际上是在尝试让一个模板 class 与另一个模板 class 成为朋友。 类似的东西:
#include <iostream>
template < typename T >
class Test1 {
private:
static int wantToBeFriend;
};
template < typename T >
int Test1<T>::wantToBeFriend = 1;
template < typename T >
class Test2 {
friend class Test1<T>;
public:
void run() {
std::cout << Test1<T>::wantToBeFriend << std::endl;
}
};
int main()
{
Test1<int> test1;
Test2<int> test2;
test2.run();
return 0;
}
但是我做不到,gcc 说 int Test1<T>::wantToBeFriend is private
。
有人知道如何实现吗?
谢谢
友谊并没有按照您试图让它发挥作用的方式发挥作用。当你有
friend class Test1<T>;
这意味着 Test1<T>
可以访问 Test2<T>
的私有成员。它不允许 Test2<T>
访问 Test1<T>
的私有成员。如果是这样,那么拥有私人成员就没有意义了,因为您可以让自己成为 class 的朋友并访问他们。
如果我们像这样切换它
template < typename T >
class Test2;
template < typename T >
class Test1 {
friend class Test2<T>;
private:
static int wantToBeFriend;
};
然后代码编译正常 Test2<T>
可以访问私有成员(Live Example)。
你需要反过来做。 Test1
需要声明Test2
为好友class:
#include <iostream>
template <typename T> class Test2;
template < typename T >
class Test1 {
template <typename U> friend class Test2;
private:
static int wantToBeFriend;
};
template < typename T >
int Test1<T>::wantToBeFriend = 1;
template < typename T >
class Test2 {
public:
void run() {
std::cout << Test1<T>::wantToBeFriend << std::endl;
}
};
int main()
{
// Test1<int> test1;
Test2<int> test2;
test2.run();
return 0;
}