![](/img/trans.png)
[英]Initialize static constexpr member variable of class template
[英]How to initialize a static member variable in class with template functions
据我发现,有一些关于在类模板中初始化静态变量的文章。 但是,我在使用带有成员函数模板的普通类,所以我不得不问。
简而言之(不是整个类的定义),我有一个看起来像这样的类:
class BatchManager
{
private:
static std::vector<BaseBatch_P> _BATCHES;
public:
template <class T>
static void placeData(T* data){
//Loop through the entire container
for (auto&& b: _BATCHES)
if (b==data){
dynamic_cast<Batch<T>>(b)->draw(data);
}
//If no bach found, create a new One
createNewBatch(data);
}
};
但是,当我要访问函数内部的成员变量时,它显示: 未定义对BatchManager :: _ BATCHES的引用
然后,我尝试了以下操作:将定义保留在类标头中:
//BatchManager.h
template <typename T>
static void placeData(T* data);
和cpp文件:
std::map<GLuint,BaseBatch_P> BatchManager::_TEXTURE_MAP;
template <typename T>
void BatchManager::placeData(T* data){
//Loop through the entire container
for (auto&& b: _BATCHES)
if (b==data){
dynamic_cast<Batch<T>>(b)->draw(data);
}
//If no bach found, create a new One
createNewBatch(data);
}
它解决了第一个问题,但随后又出现了一个问题,当我想从程序中调用静态函数时会发生这种情况:
BatchManager::render(_data);
错误消息如下所示:
undefined reference to BatchManager::placeData<DataType>(DataType*)
我该如何解决这个问题? 还是我做错了什么?
像这样:
#include <vector>
#include <typeinfo>
struct BaseBatch {
virtual const std::type_info& get_type() const = 0;
virtual ~BaseBatch() = default;
};
template<class T>
struct Batch : BaseBatch
{
const std::type_info& get_type() const override
{
return typeid(T);
}
void draw(T* data) {}
};
using BaseBatch_P = BaseBatch*;
class BatchManager
{
private:
static std::vector<BaseBatch_P>& get_batches() {
static std::vector<BaseBatch_P> _;
return _;
}
public:
template <class T>
static void placeData(T* data){
//Loop through the entire container
bool found = false;
for (auto&& b: get_batches())
if (b->get_type() == typeid(T)) {
dynamic_cast<Batch<T>*>(b)->draw(data);
found = true;
}
//If no bach found, create a new One
if (not found) {
get_batches().push_back(new Batch<T>);
}
}
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.