gpt4 book ai didi

C++ intrusive_ptr 问题

转载 作者:太空宇宙 更新时间:2023-11-04 15:24:26 29 4
gpt4 key购买 nike

我想使用 boost::intrusive_ptr 来引用我的类 x::Y,所以我添加了一个 references 字段和友元声明对于 releaseadd_ref 函数,它们应该在命名空间 boost 中定义。然后,我编写那些函数。像这样:

namespace x{


class Y{
long references;
friend void boost::intrusive_ptr_add_ref(x::Y * p);
friend void boost::intrusive_ptr_release(x::Y * p);
};
}

namespace boost
{
void intrusive_ptr_add_ref(x::Y * p)
{
++(p->references);
}

void intrusive_ptr_release(x::Y * p)
{
if (--(p->references) == 0)
delete p;
}
}

代码未编译,我收到以下错误:

test/test6.cpp:8:18: error: ‘boost’ has not been declared
test/test6.cpp:9:18: error: ‘boost’ has not been declared
test/test6.cpp: In function ‘void boost::intrusive_ptr_add_ref(x::Y*)’:
test/test6.cpp:7:11: error: ‘long int x::Y::references’ is private
test/test6.cpp:17:9: error: within this context
test/test6.cpp: In function ‘void boost::intrusive_ptr_release(x::Y*)’:
test/test6.cpp:7:11: error: ‘long int x::Y::references’ is private
test/test6.cpp:22:13: error: within this context

我以为我做了 boost 文档中解释的所有事情,但似乎我做错了什么。问题出在哪里?

最佳答案

错误是因为您在类定义中引用了 boost 命名空间,在该命名空间的任何声明之前。您可以通过在类定义之前声明 namespace boost 来修复它;您还需要声明函数,为此您还需要声明类和命名空间:

namespace x {class Y;}
namespace boost
{
    void intrusive_ptr_add_ref(x::Y * p);
    void intrusive_ptr_release(x::Y * p);
}

但是,最好不要将函数放在 boost 命名空间中,而是放在包含您的类的命名空间中(即 namespace x)。然后 intrusive_ptr 将通过依赖于参数的名称查找找到正确的版本。这不需要在课前进行任何声明。

关于C++ intrusive_ptr 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12217372/

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