为什么c ++在函数定义中不接受静态关键字?

时间:2016-03-17 08:20:07

标签: c++ static

我有一个程序,其中类T具有静态函数。

static void T::func()
{
    m_i=10;
    cout<<m_i<<endl;
}

当我尝试在函数定义中添加static时,编译器会抛出错误 错误:无法声明成员函数'static void T :: func()'具有静态链接。 为什么它不接受定义中的静态关键字?

2 个答案:

答案 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;
}