友元函数和命名空间。无法访问 class 中的私有成员
Friend functions and namespaces. Cannot access private member in class
所以我在 foo
命名空间中有一个 class
,其中包含一个 friend
函数。现在我希望 friend
函数的定义位于不同的命名空间 bar
中,这样它就可以按照您在下面看到的方式调用。我得到的错误是无法访问私有成员 val
。
问题:为什么?
#include <iostream>
namespace foo
{
template<typename T>
class myclass
{
private:
T val;
public:
myclass(T v) : val(v) {}
template<class U>
friend void myfun(myclass<U>);
};
namespace bar
{
template<class U>
void myfun(myclass<U> a)
{
std::cout << a.val;
}
} //bar
} //foo
int main()
{
foo::myclass<int> a(5);
foo::bar::myfun(a);
}
您应该在友元声明之前声明 foo::bar::myfun
并使用适当的命名空间限定 (bar::
):
namespace foo
{
template<typename T>
class myclass;
namespace bar
{
template<class U>
void myfun(myclass<U> a);
} //bar
template<typename T>
class myclass
{
private:
T val;
public:
myclass(T v) : val(v) {}
template<class U>
friend void bar::myfun(myclass<U>);
};
} //foo
否则另一个名为 myfun
的函数将通过友元声明在 foo
命名空间中声明。
所以我在 foo
命名空间中有一个 class
,其中包含一个 friend
函数。现在我希望 friend
函数的定义位于不同的命名空间 bar
中,这样它就可以按照您在下面看到的方式调用。我得到的错误是无法访问私有成员 val
。
问题:为什么?
#include <iostream>
namespace foo
{
template<typename T>
class myclass
{
private:
T val;
public:
myclass(T v) : val(v) {}
template<class U>
friend void myfun(myclass<U>);
};
namespace bar
{
template<class U>
void myfun(myclass<U> a)
{
std::cout << a.val;
}
} //bar
} //foo
int main()
{
foo::myclass<int> a(5);
foo::bar::myfun(a);
}
您应该在友元声明之前声明 foo::bar::myfun
并使用适当的命名空间限定 (bar::
):
namespace foo
{
template<typename T>
class myclass;
namespace bar
{
template<class U>
void myfun(myclass<U> a);
} //bar
template<typename T>
class myclass
{
private:
T val;
public:
myclass(T v) : val(v) {}
template<class U>
friend void bar::myfun(myclass<U>);
};
} //foo
否则另一个名为 myfun
的函数将通过友元声明在 foo
命名空间中声明。