【问题标题】:Use of class template std::unique_ptr requires template arguments with MariaDB Connector C++使用类模板 std::unique_ptr 需要带有 MariaDB 连接器 C++ 的模板参数
【发布时间】:2021-06-21 14:09:12
【问题描述】:

我对此有疑问。它一直在扔 错误:

use of class template 'std::unique_ptr' requires template arguments

我已经搜索了一个小时。我试过用c++17编译,还是不行。如何让 MariaDB 连接器工作?我安装了 MariaDB 连接器。我在 Debian 10 上。并使用 clang++ v7 进行编译。我尝试在标题中添加

我正在使用这个编译:clang++ -I/usr/include/mariadb/concpp/compat -O3 -Wall -o ./getUsers ./getUsers.cpp -lmariadbcpp

#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;
}

【问题讨论】:

  • std::unique_ptr 不是类型。它是一个模板。例如std::unique_ptr&lt;int&gt; 是一个类型。你不能用auto 吗?
  • 当 x 是智能指针时不要调用 delete x;
  • 这是一个很好的初学者问题,而且标题在搜索引擎上是超级搜索的,所以它有更大的机会帮助别人。我对 OP 表示敬意!我编辑了问题的标题,使其更易于搜索。
  • @463035818_is_not_a_number:有人可能会考虑 C++17 CTAD,但对于 std::unique_ptr,“不可用”(构造函数不允许扣除 T):-)
  • @Jarod42 确实,我正在考虑 CTAD。我认为不幸的是,像“[模板名称] 不是类”这样的声明需要很长的解释,当新功能使我的 C++ 简单心智模型无效时,我不喜欢它:P

标签: c++ mariadb


【解决方案1】:

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

// ...

//             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++ 中的设计选择。

现在,您还删除了唯一指针,但这不是隐性的。

// 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;

【讨论】:

  • 顺便说一句,这里是关于unique_ptr 的设计选择和实现stackoverflow.com/questions/51109767/… 的参考文献
  • @Jarod42 该标准可以添加推导指南,但不能正确推导数组。看到这个答案:stackoverflow.com/a/51109812/2104697
  • @GuillaumeRacicot:我想挑剔解释,但错过了 “为什么”“如何” 的观点 :-)跨度>
  • @Jarod42 现在应该更好了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多