gpt4 book ai didi

C++ ODB 数据库映射器:无法在关系中使用 std::weak_ptr

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

我正在尝试使用 ODB 建立一对多关系的模型。我基本上是在尝试重新创建 https://www.codesynthesis.com/products/odb/doc/manual.xhtml#6.2.2 中的示例

我必须使用 std::weak_ptr对于关系的一方,避免循环所有权问题。但是,我的非常简单的示例代码无法编译,因为 ODB 似乎不能很好地与 std::weak_ptr 配合使用。

在我的示例中,每个 Bar正好有一个Foo , 而每个 Foo有多个Bar秒。这是我的代码:

#include <odb/core.hxx>
#include <string>
#include <memory>
#include <vector>

// Forward
class Foo;

#pragma db object
class Bar {
public:
// A Bar has exactly *one* Foo
#pragma db not_null
std::shared_ptr<Foo> cfg;

private:
#pragma db id auto
unsigned long id_;
friend class odb::access;
};

#pragma db object
class Foo {
public:
// A Foo has multiple Bars
// Using std::weak_ptr here instead of std::shared_ptr to avoid circular
// ownership
#pragma db value_not_null inverse(cfg)
std::vector<std::weak_ptr<Bar>> entries;

private:
#pragma db id auto
unsigned long id_;
friend class odb::access;
};

int main() {}

我生成数据库代码:

odb --std c++11 --database sqlite --generate-query --generate-schema --at-once main.hpp

然后我这样编译:

g++ --std=c++11 main.hpp main-odb.cxx

(我知道这会在链接时崩溃 - 我只是想让它编译。)

我的编译器 (GCC 7) 告诉我:

main-odb.cxx: In static member function ‘static void odb::access::object_traits_impl<Foo, (odb::database_id)1u>::entries_traits::init(odb::access::object_traits_impl<Foo, (odb::database_id)1u>::entries_traits::value_type&, const odb::access::object_traits_impl<Foo, (odb::database_id)1u>::entries_traits::data_image_type&, odb::database*)’:
main-odb.cxx:794:43: error: no matching function for call to ‘std::weak_ptr<Bar>::weak_ptr(odb::object_traits<Bar>::pointer_type)’
obj_traits::object_type > (id));
^
In file included from /usr/include/c++/5/memory:82:0,
from main.hpp:3,
from main-odb.hxx:16,
from main-odb.cxx:7:
/usr/include/c++/5/bits/shared_ptr.h:492:2: note: candidate: template<class _Tp1, class> std::weak_ptr<_Tp>::weak_ptr(std::weak_ptr<_Tp1>&&)
weak_ptr(weak_ptr<_Tp1>&& __r) noexcept
^
/usr/include/c++/5/bits/shared_ptr.h:492:2: note: template argument deduction/substitution failed:
main-odb.cxx:794:43: note: mismatched types ‘std::weak_ptr<_Tp>’ and ‘odb::object_traits<Bar>::pointer_type {aka Bar*}’
obj_traits::object_type > (id));

我跳过了另外三个候选人。重要的部分:ODB 试图在某处创建一个 std::weak_ptr<Bar>来自Bar * ,这显然是不可能的。它必须从 std::shared_ptr<Bar> 创建它.但是,ODB 文档明确表示应该(事实上必须)使用 std::weak_ptr在这些情况下。

我做错了什么?

最佳答案

好的,我想出了一个解决方案(不确定这是不是最好的解决方案):

您可以强制 ODB 使用 std::shared_ptr<Bar>而不是 Bar *到处。您可以通过将类定义为:

#pragma db object pointer(std::shared_ptr)
class Bar {
...

这样,当一个 std::weak_ptr<Bar>正在创建,它是从 std::shared_ptr<Bar> 创建的,这有效。您还可以指定要在 namespace 或全局范围内使用的指针类型,请参阅 https://www.codesynthesis.com/products/odb/doc/manual.xhtml#3.3

关于C++ ODB 数据库映射器:无法在关系中使用 std::weak_ptr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51652818/

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