【问题标题】:Unique Pointer to non-pointer compile error指向非指针编译错误的唯一指针
【发布时间】:2018-05-07 11:13:37
【问题描述】:

我尝试实现指向非指针的唯一指针,如下所述: One-liner for RAII on non pointer?https://dzone.com/articles/c11-smart-pointers-are-not 。但我总是得到一个编译器错误:/usr/include/c++/5/bits/unique_ptr.h:235:12:错误:'unsigned int'和'std::nullptr_t'类型的无效操作数到二进制'operator!= '

这是我的代码:

struct ShaderDeleter
{
    typedef GLuint pointer; // Note the added typedef
    void operator()(GLuint shader) {
        glDeleteShader(shader);
    }
};

int main() {
    std::unique_ptr<GLuint, ShaderDeleter> smart_shader{glCreateShader(GL_VERTEX_SHADER)};
}

我做错了什么?

平台:Ubuntu 16.04

编译器:g++

【问题讨论】:

  • 如果你只是注释掉typedef会发生什么?
  • 编译器错误:Test.cpp:26:86:错误:没有匹配函数调用 'std::unique_ptr::unique_ptr() '
  • 是的,这就是我添加 typedef 的原因。根据链接的 SO question and article,如果您在删除器中使用 typedef 作为指针,您应该也可以将 unique_ptr 用于非指针类型。
  • 文章似乎是错误的,如您链接的 SO 答案中所述。即使您在删除器中更改T,它仍然必须满足 NullablePointer 概念,这就是为什么您的代码或文章will not work:您无法将GLuintnullptr 进行比较,这正是unique_ptr 构造函数的作用。
  • 最好将GLuint 包装到一个专用的包装器中,这样也可以防止混合不相关的值(例如GLuint 用于着色器,GLuint 用于缓冲区)。

标签: c++ c++11 c++17


【解决方案1】:

根据 C++17 [unique.ptr.single]/3:

[...] unique_ptr&lt;T, D&gt;::pointer 类型应满足NullablePointer 的要求。

这些要求可在 [nullablepointer.semantics] 中找到,即summarised here。简而言之,该类型必须允许与nullptr 进行比较。所以整数不能用作类型。

非 SO 链接中的代码格式不正确。 SO link 中“fjoanis”的答案中的代码也是格式错误的。


相反,您可以使用该问题的其他解决方案之一。恕我直言 unique_ptr 不适合此任务。有 a proposal P0052 表示为此目的而设计的名为 std::unique_resource 的东西。

我可能会因为提到这一点而被否决,但也许您可以尝试使用 void * 作为指针类型,并将 GLuint 转换为 void *。一般来说,这样的转换是不可移植的,可能会导致运行时异常,但在常见的 x86 平台上,您可能会侥幸逃脱。 Link to example that compiles.

【讨论】:

  • 与其进入龙的领域并处理可能的fun,也许提供一个像here这样的轻量级可为空的盒子是可能的并且相对容易我正在考虑做一个补充答案与您的代码,所以它很容易在现场访问。我使用了int,但它应该很容易将其转换为GLuint 或模板类型和空值。它似乎按预期工作。
  • @luk32 也许你可以把它发到this thread
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-23
  • 2013-04-28
  • 1970-01-01
  • 2019-09-03
  • 1970-01-01
  • 2014-04-12
  • 1970-01-01
相关资源
最近更新 更多