唯一指向非指针编译错误的指针

时间:2018-05-07 11:13:37

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

我尝试实现非指针的唯一指针,如下所述: 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'的无效操作数到二元'运算符!= “

这是我的代码:

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 ++

1 个答案:

答案 0 :(得分:3)

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

  

[...] public function get_top_headlines( $query=null, $category=null, $country=null, $sources=null, $page_size=null, $page=null ){ $url = $this->api_url . $this->endpoint_top_headlines; $params = array(); if ( $query !== null ){ $params['q'] = urlencode( $query ); } if ( $category !== null ){ $params['category'] = $category; } if ( $country !== null ){ $params['country'] = $country; } if ( $sources !== null ){ $params['sources'] = $sources; } if ( $page_size !== null ){ $params['pageSize'] = $page_size; } if ( $page !== null ){ $params['page'] = $page; } $params['apiKey'] = $this->api_key; $url_query = http_build_query( $params ); $url = $url . '?' . $url_query; echo $url; $obj = $this->get_response( $url ); return $obj; } 类型应满足unique_ptr<T, D>::pointer的要求。

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

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

相反,您可以使用其他解决方案来解决该问题。恕我直言nullptr不适合这项任务。对于为此目的而设计的名为unique_ptr的内容有a proposal P0052

我可能会因为提及这一点而被投票,但也许您可以尝试使用std::unique_resource作为指针类型,并将GLuint转换为void *。通常,这样的转换是不可移植的,并且可能导致运行时异常,但是在常见的x86平台上,您可能会使用它。 Link to example that compiles