あなたの特定の例では、fcn
function の何も実際には 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));
}
上記の例で注目すべき点は、相互依存関係を切り離し、 free-function が 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));
}
それが役に立てば幸い。幸運を!