首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >要使用类模板连接器,需要将模板参数与MariaDB std::unique_ptr C++一起使用

要使用类模板连接器,需要将模板参数与MariaDB std::unique_ptr C++一起使用
EN

Stack Overflow用户
提问于 2021-06-21 22:09:13
回答 1查看 61关注 0票数 1

我对此有意见。它一直抛出错误:

代码语言:javascript
运行
复制
use of class template 'std::unique_ptr' requires template arguments

我已经找了一个小时了。我尝试过使用c++17进行编译,但仍然不起作用。如何使MariaDB连接器工作?我安装了MariaDB连接器。我在debian10上,使用clang++ v7进行编译。我尝试在标题中添加一个选项,但仍然不起作用。

我正在使用以下代码进行编译:clang++ -I/usr/include/mariadb/concpp/compat -O3 -Wall -o ./getUsers ./getUsers.cpp -lmariadbcpp

代码语言:javascript
运行
复制
#include <iostream> 
#include <cstring>
#include <mariadb/conncpp.hpp>

using namespace std;

// Main Process
int main(){
    try {
        // Instantiate Driver
        sql::Driver* driver = sql::mariadb::get_driver_instance();

        // Configure Connection
        sql::SQLString url("jdbc:mariadb://x.x.x.x:3306/todo");
        sql::Properties properties({{"user", "xxxx"}, {"password", "xxxx"}});

        // Establish Connection
        std::unique_ptr conn(driver->connect(url, properties));

        // Create a new Statement
        std::unique_ptr stmnt(conn->createStatement());
        // Execute query
        sql::ResultSet *res = stmnt->executeQuery("SELECT id, username FROM accounts");
        // Loop through and print results
        while (res->next()) {
            std::cout << res->getInt("id") << ") ";
            std::cout << res->getString("username");
        }
    }
    catch(sql::SQLException& e){
      std::cerr << "Error selecting tasks: " << e.what() << std::endl;
   }

   delete res;
   delete stmnt;
   delete conn;

   // Exit (Success)
   return 0;
}
EN

Stack Overflow用户

发布于 2021-06-21 22:12:34

编译器是正确的:使用类模板std::unique_ptr需要模板参数。必须为std::unique_ptr类型提供模板参数。

代码语言:javascript
运行
复制
// ...

//             v---------------v---- template arguments
std::unique_ptr<sql::Connection> stmnt(conn->createStatement());

// ...

//             v----------------------v----- same here
std::unique_ptr<sql::PreparedStatement> stmnt(conn->createStatement());

请参阅How to Connect C++ Programs to MariaDB

C++17通常可以推断出类模板的类型,但std::unique_ptr不能。由于定义方式的原因,std::unique_ptr构造函数无法演绎类型,并且演绎指南并不是故意添加到std::unique_ptr中的。这是因为原始数组和指针都是以相同的方式传递的,所以std::unique_ptr无法区分删除方式不同的int*int[]。这是C语言的一个怪癖,它仍然影响着C++中的设计选择。

现在,您还删除了唯一指针,但这并不是必需的。

代码语言:javascript
运行
复制
// Res is not a unique pointer, you still need to delete it.
delete res;

// You don't need that, those are unique pointers, remove it from your code.
delete stmnt;
delete conn;
票数 6
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68069441

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档