在之前的问答(如何在另一个 C++ 命名空间中定义全局命名空间中的友元?)中,给出了在引用全局命名空间中的函数的命名空间内定义友元函数的解决方案。
我对classes有同样的问题。
class CBaseSD;
namespace cb {
class CBase
{
friend class ::CBaseSD; // <-- this does not work!?
private:
int m_type;
public:
CBase(int t) : m_type(t) {};
};
}; // namespace cb
class CBaseSD
{
private:
cb::CBase* m_base;
public:
CBaseSD(cb::CBase* base) : m_base(base) {};
int* getTypePtr()
{ return &(m_base->m_type); };
};
Run Code Online (Sandbox Code Playgroud)
如果我将 CBaseSD 放入命名空间,它就可以工作;例如,朋友类 SD::CBaseSD;但我还没有找到适用于全局命名空间的咒语。
我正在使用 g++ 4.1.2 进行编译。
当我尝试GHistogram从extractHistogram()实现中访问类的bin私有成员时,我收到以下错误:
error: 'QVector<double> MyNamespace::GHistogram::bins' is private
error: within this context
Run Code Online (Sandbox Code Playgroud)
"在此上下文中"错误指向extractHistogram()实现的位置.有谁知道我朋友的功能声明有什么问题?
这是代码:
namespace MyNamespace{
class GHistogram
{
public:
GHistogram(qint32 numberOfBins);
qint32 getNumberOfBins();
/**
* Returns the frequency of the value i.
*/
double getValueAt(qint32 i);
friend GHistogram * MyNamespace::extractHistogram(GImage *image,
qint32 numberOfBins);
private:
QVector<double> bins;
};
GHistogram * extractHistogram(GImage * image,
qint32 numberOfBins);
} // End of MyNamespace
Run Code Online (Sandbox Code Playgroud) 我偶然发现了一个相当奇特的c ++命名空间问题:
浓缩的例子:
extern "C" {
void solve(lprec * lp);
}
class A {
public:
lprec * lp;
void solve(int foo);
}
void A::solve(int foo)
{
solve(lp);
}
Run Code Online (Sandbox Code Playgroud)
我想在我的C++成员函数A :: solve中调用c函数solve.编译器对我的意图不满意:
error C2664: 'lp_solve_ilp::solve' : cannot convert parameter 1 from 'lprec *' to 'int'
Run Code Online (Sandbox Code Playgroud)
有什么我可以在解决功能的前缀?C :: solve不起作用