是否可以在 C++ 中的 class 的静态方法中初始化静态成员?

Is it possible to initialise a static member in a static method of a class in C++?

所以我有静态成员 precision 和一个 public 静态方法来在我的 class 中设置它的值(下面的代码被精简了很多)。

class Foo {
private:
    typedef unsigned short precision_t;
    static precision_t precision;
public:
    static void set_precision(precision_t value) {
        precision_t precision = value;
        /* other stuff */
    }
    
    static precision_t get_precision() {
        return precision;
    }
};

当我创建一个实例然后设置值时,它似乎工作正常,但尝试获取该值时会出现一个稍微神秘的错误:main.cpp:(.text._ZN3Foo13get_precisionEv[_ZN3Foo13get_precisionEv]+0x7): undefined reference to `Foo::precision' collect2: error: ld returned 1 exit status(运行 on onlinegdb.com).

主要代码中的确切代码:

Foo *foo = new Foo(); //fine
foo->set_precision(5); //no error, but probably wrong given undefined reference
std::cout << Foo::get_precision(); //shows above error

我的 set_precision 原始代码看起来更像

static void set_precision(precision_t value) {
    static bool defined = false;
    if (defined) {
        precision = value
    } else {
        precision_t precision = value;
        defined = true;
    }
    /* other stuff */
}

所以它只会在第一次 precision 时初始化。

我还尝试对存储指向所有实例的指针的向量执行此操作,而不必编写代码以在 class/in .cpp 文件之外进行初始化。

是否可以在 main 函数之前在 .cpp 文件中初始化(存储实例指针的向量和存储当前精度的无符号短整数) ?

更新代码:

#include <iostream>
using namespace std;

class Foo {
private:
    typedef unsigned short precision_t;
    static inline precision_t precision; 
    //static precision_t precision; //when not using static inline
public:
    static void set_precision(precision_t value) {
        //precision_t precision = value; //<<-- error in your code
        precision = value; 
        /* other stuff */
    }
    
    static precision_t get_precision() {
        return precision;
    }
};

//Foo::precision_t Foo::precision = 0; //when not using static inline

int main() {
    Foo *foo = new Foo(); //fine
    foo->set_precision(5); //no error, but probably wrong given undefined reference
    std::cout << Foo::get_precision(); //shows above error
    return 0;
}