似乎在您的特定示例中,fcn函数中没有任何内容实际上依赖于 class A。它甚至不需要访问 A 的任何方法/字段,无论是公共的还是受保护的/私有的。所以这没有意义。否则它会有一些意义,但无论如何,似乎值得重新考虑你的问题并提出一个不需要像这样的黑客攻击的更清洁的解决方案。如果经过深思熟虑,你仍然认为你需要它,你可以这样做:
#include <cstdio>
template<typename T> typename T::member_type fcn(const T & v) {
return v.value_;
}
template<class T>
class A {
public:
typedef T member_type;
friend member_type fcn< A<T> >(const A<T> &);
A() : value_(1986) {}
private:
T value_;
};
int main()
{
A<int> a;
printf("The value is: %d\n", fcn(a));
}
上面示例中值得注意的是,您需要解耦交叉依赖并使您的自由函数不依赖于 class 的声明A。如果您仍然觉得需要这种耦合,那么以下代码也可以使用:
#include <cstdio>
template <typename T>
class A;
template <typename T> typename A<T>::member_type fcn(const A<T> & v) {
return v.value_;
}
template <typename T>
class A {
public:
typedef int member_type;
friend member_type fcn<T>(const A<T> &);
A() : value_(1986) {}
private:
member_type value_;
};
int main()
{
A<void> a;
printf("The value is: %d\n", fcn(a));
}
希望能帮助到你。祝你好运!