我有一个程序,其中类T具有静态函数。
static void T::func()
{
m_i=10;
cout<<m_i<<endl;
}
当我尝试在函数定义中添加static时,编译器会抛出错误 错误:无法声明成员函数'static void T :: func()'具有静态链接。 为什么它不接受定义中的静态关键字?
答案 0 :(得分:9)
问题在于关键字static
根据上下文意味着不同的事情。
当您将成员函数声明为静态时,例如
class T
{
...
static void func();
...
};
然后static
关键字表示func
是类函数,它不绑定到特定对象。
在源文件中定义函数时,例如
static void T::func() { ... }
然后设置函数 linkage ,这与在类中的声明中使用static
不同。 static
在定义函数时所做的是说该函数仅在当前translation unit中可用,并且与所有知道该类的人都可以使用该函数的声明相矛盾。
根本不可能使成员函数(声明为static
)具有静态链接。
如果 您想要隐藏其他人的成员函数,那么就无法调用它,为什么不简单地将其作为private
成员功能?您也可以使用the pimpl idiom之类的内容,或者只是将其作为成员函数开始使用,在这种情况下,您可以声明它具有static
链接。
答案 1 :(得分:2)
在实现中,您不需要静态,只能在定义中使用。
T.h
class T
{
int m_i;
static int s_i;
public:
static void func();
};
T.cpp
int T:s_i = 0;
void T::func()
{
// Access only static and local variables
// I.e this is not allowed
m_i=10;
// This is allowed
s_i=10;
}