gpt4 book ai didi

c++ - 模板类问题中的静态分配器( 'sizeof' 对不完整类型的无效应用)

转载 作者:太空狗 更新时间:2023-10-29 21:37:59 24 4
gpt4 key购买 nike

我已经编辑了原始问题。


我正在尝试在模板类中使用自行实现的静态分配器,但出现此错误:

错误:“sizeof”对不完整类型的无效应用

我已尝试最小化代码但仍然保留错误,这就是我得到的结果:

template<typename T>
struct allocator_t {
unsigned char blk[sizeof(T)];
};

template<typename t_value_t, int t_max_nodes>
class foo_c {
private:
typedef allocator_t<foo_c> bar_allocator_t;
static bar_allocator_t m_allocator;
};

template<typename t_value_t, int t_max_nodes>
typename foo_c<t_value_t, t_max_nodes>::bar_allocator_t
foo_c<t_value_t, t_max_nodes>::bar_t::m_allocator;

struct some_t {
explicit some_t(void) {}
};

void func(void) {
foo_c<some_t, 10> a;
}

完整的错误堆栈是这样的:

template_static_example.cc: In instantiation of 'allocator_t<foo_c<some_t, 10> >':
template_static_example.cc:21:2: instantiated from 'foo_c<some_t, 10>'
template_static_example.cc:30:21: instantiated from here
template_static_example.cc:3:30: error: invalid application of 'sizeof' to incomplete type 'foo_c<some_t, 10>'

我有其他模块基本上使用相同的技术,一切都很棒。

这些模块与我尝试制作的新模块之间的区别在于,新模块是模板化的,事实上,上面的代码(减去模板)编译时没有错误:

template<typename T>
struct allocator_t {
unsigned char blk[sizeof(T)];
};

class foo_c {
private:
typedef allocator_t<foo_c> bar_allocator_t;
static bar_allocator_t m_allocator;
};

foo_c::bar_allocator_t foo_c::m_allocator;

struct some_t {
explicit some_t(void) {}
};

void func(void) {
foo_c a;
}

我可以提供的另一个输入是,当我使用 clang 编译时,两者都没有错误地编译。但是,g++ 仅接受非模板化版本。

最佳答案

我相信事物的核心foo_c不完整,因为它的大小取决于 allocator_t 的大小,但是 allocator_t取决于 foo_c 的大小.

如果我们改为给出 foo_c指向 allocator_t<foo_c> 的指针,那么事情就可以了,因为这是我们可以对不完整类型做的少数事情之一。

template<typename t_value_t, int t_max_nodes>
class foo_c {
private:
typedef allocator_t<foo_c> bar_allocator_t;
static std::unique_ptr<bar_allocator_t> m_allocator;
};

template<typename t_value_t, int t_max_nodes>
std::unique_ptr<typename foo_c<t_value_t, t_max_nodes>::bar_allocator_t>
foo_c<t_value_t, t_max_nodes>::m_allocator;

Live Demo


看来 GCC 和 Clang will compile your code只要你转发声明allocator_t ,然后稍后放置它的定义,但我不确定这是定义的行为。

关于c++ - 模板类问题中的静态分配器( 'sizeof' 对不完整类型的无效应用),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36422155/

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