我尝试实现非指针的唯一指针,如下所述: 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 ++
答案 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