繁体   English   中英

为什么我不能使用 dbstl::map<string, int> 在伯克利 DB C++?</string,>

[英]why cant I use dbstl::map<string, int> in Berkeley DB C++?

我使用 C++、Berkeley DB 18.1.40 STL 和 Visual Studio 2015。我通过项目设置包含库 我不能使用 dbstl::map<string, int> 并收到错误,但使用 dbstl::map<string, string>一切正常

我的代码:

#define _CRT_SECURE_NO_WARNINGS
#pragma comment(lib, "libdb181.lib")
#pragma comment(lib, "libdb_stl181.lib")

#include "stdafx.h"
#include <iostream>
#include <dbstl_map.h>
#include <vector>
using namespace std;

int main(){
    const char* db_name = "db";
    const char* db_home_dir = "dirdb";

    DbEnv env(DB_CXX_NO_EXCEPTIONS);
    Db* pdb;

    try {
        dbstl::dbstl_startup();

        env.set_error_stream(&cerr);
        env.open(db_home_dir, DB_CREATE | DB_INIT_MPOOL, 0);

        pdb = new Db(&env, DB_CXX_NO_EXCEPTIONS);
        pdb->open(NULL, db_name, NULL, DB_BTREE, DB_CREATE, 0);

        /* STRING */

        typedef dbstl::db_map<string, string> dbmap_string;
        dbmap_string map_string(pdb, &env);
        string key_string = "string";
        string value_string = "its string!";
        map_string.insert({ key_string, value_string });

        string outvalue_string = map_string[key_string];
        cout << "key: " << key_string << endl << "value: " << outvalue_string << endl << endl;

        /* INT */
        
        typedef dbstl::db_map<string, u_int32_t> dbmap_int;
        dbmap_int map_digit(pdb, &env);

        string key_digit = "digit";
        u_int32_t value_digit = 5;
        map_digit.insert({ key_digit, value_digit });

        dbstl::dbstl_exit();

        if (pdb != NULL) {
            pdb->close(0);
            delete pdb;
        }
        env.close(0);

    

    }
    catch (DbException& e) {
        cerr << "DbException: " << e.what() << endl;
        return -1;
    }
    catch (std::exception& e) {
        cerr << e.what() << endl;
        return -1;
    }

    cout << "hello";
    _sleep(5000);
    return 0;
}

我得到错误:

错误 C2516“ddt”:不是合法基础 class ConsoleApplication8 c:\users\kordi\desktop\db18.1.40\lang\cxx\stl\dbstl_element_ref.h 58

1>c:\users\kordi\desktop\db-18.1.40\lang\cxx\stl\dbstl_element_ref.h(58): error C2516: 'ddt': is not a legal base class
1>  C:\Users\kordi\Desktop\db-18.1.40\lang\cxx\stl\dbstl_map.h(727): note: see declaration of 'ddt'
1>  C:\Users\kordi\Desktop\db-18.1.40\lang\cxx\stl\dbstl_map.h(727): note: see reference to class template instantiation 'dbstl::ElementRef<ddt>' being compiled
1>          with
1>          [
1>              ddt=u_int32_t
1>          ]
1>  C:\Users\kordi\Desktop\db-18.1.40\lang\cxx\stl\dbstl_map.h(1148): note: see reference to class template instantiation 'dbstl::db_map_iterator<kdt,ddt,value_type_sub>' being compiled
1>          with
1>          [
1>              kdt=std::string,
1>              ddt=u_int32_t,
1>              value_type_sub=dbstl::ElementRef<u_int32_t>
1>          ]
1>  ConsoleApplication8.cpp(55): note: see reference to class template instantiation 'dbstl::db_map<std::string,u_int32_t,dbstl::ElementRef<ddt>,dbstl::db_map_iterator<kdt,ddt,value_type_sub>>' being compiled
1>          with
1>          [
1>              ddt=u_int32_t,
1>              kdt=std::string,
1>              value_type_sub=dbstl::ElementRef<u_int32_t>
1>          ]

在此处输入图像描述

为什么我会收到此错误? 我可以修好吗?

u_int32_t案例中,您最终使用了ElementRef而不是ElementHolder

  • ElementHolder class 用于将原始类型[如u_int32_t ,我的编辑] 存储到 STL 容器中”
  • ElementRef class 用于将其他类型存储到 STL 容器中”

ElementRef在您的情况下那样从u_int32_t继承是永远行不通的。 它应该是一个ElementHolder<u_int32_t>

您需要更改包含原始类型的 map:

typedef dbstl::db_map<string, ElementHolder<u_int32_t>> dbmap_int;
//                            ^^^^^^^^^^^^^^^^^^^^^^^^

这似乎也符合示例和文档@ docs.oracle.com

ElementHolder class 模板应该用于将存储 C++ 原始数据类型(例如intfloatchar *wchar_t *等)的每种类型的dbstl容器。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM