gpt4 book ai didi

C++定义静态成员的正确方法是什么

转载 作者:搜寻专家 更新时间:2023-10-31 00:52:28 26 4
gpt4 key购买 nike

我正在尝试在普通成员函数中使用静态成员。但是编译器报告了一些错误。请看一下这段代码

#include <memory>

template<typename T>
class MyClass {
private:
static std::allocator<T> alloc;
T *p;
public:
void assign(T e) {
p = alloc.allocate(1);
alloc.construct(p, e);
}
};

这就是我使用它的方式:

#include 'myclass.h'

int main() {
MyClass<int> cls;
cls.assign(4);

};

编译器报错:

/Users/liuziqi/CLionProjects/cpplearning/src/tt.h:17:9: warning: instantiation of variable 'MyClass<int>::alloc' required here, but no definition is available [-Wundefined-var-template]
p = alloc.allocate(1);
^
/Users/liuziqi/CLionProjects/cpplearning/src/main.cpp:49:7: note: in instantiation of member function 'MyClass<int>::assign' requested here
cls.assign(4);
^
/Users/liuziqi/CLionProjects/cpplearning/src/tt.h:13:28: note: forward declaration of template entity is here
static std::allocator<T> alloc;
^
/Users/liuziqi/CLionProjects/cpplearning/src/tt.h:17:9: note: add an explicit instantiation declaration to suppress this warning if 'MyClass<int>::alloc' is explicitly instantiated in another translation unit
p = alloc.allocate(1);

我不知道哪一部分是错的.....我已经定义了静态成员和任何成员函数应该能够使用它。此错误是否与模板有关? (刚刚学了template,不知道用对了没。)

最佳答案

除了回答“如何修复”问题(之前肯定已经回答过很多次)之外,我将尝试描述警告所指的内容...

因为 MyClass 是一个模板,编译器希望模板化类的所有代码都在同一个文件 (myclass.h) 中可用。由于您只在 myclass.h 中声明但没有定义 alloc,因此编译器会认为您犯了一个错误。它不是绝对必须存在的(因此警告而不是错误),如果您在别处定义变量,您可以禁用警告,但这几乎可以肯定只是一个错误。

如果您使用的是 c++17,处理此问题的最简单方法是将静态成员声明为内联,因此它将在此处定义:

  static inline std::allocator<T> alloc;

直播:https://godbolt.org/g/cr1aUP

在 C++17 之前,您需要在 myclass.h 中显式定义变量:

template<typename T>
std::allocator<T> MyClass<T>::alloc;

直播:https://godbolt.org/g/2Znqst

关于C++定义静态成员的正确方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51585636/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com