C ++ 11 std :: unique_ptr删除

时间:2017-08-31 14:16:33

标签: c++ linux c++11

我使用了以下代码,但g ++给了我错误。

takeIf

g ++错误消息。

#include <stdio.h>
#include <memory>

using Func = void (*)(void *p);

class A {
};

class B {
    std::unique_ptr<A, Func> b = std::unique_ptr<A, Func>(nullptr, nullptr);
};

int main()
{

}

g ++版

test.cc:10:50: error: expected ‘;’ at end of member declaration
std::unique_ptr<A, Func> b = std::unique_ptr<A, Func>(nullptr, nullptr);
                                              ^
test.cc:10:50: error: declaration of ‘std::unique_ptr<A, void (*)(void*)> B::Func’ [-fpermissive]
test.cc:4:31: error: changes meaning of ‘Func’ from ‘using Func = void (*)(void*)’ [-fpermissive]
using Func = void (*)(void *p);
                           ^
test.cc:10:54: error: expected unqualified-id before ‘>’ token
std::unique_ptr<A, Func> b = std::unique_ptr<A, Func>(nullptr, nullptr);
                                                  ^
test.cc:10:47: error: template argument 1 is invalid
std::unique_ptr<A, Func> b = std::unique_ptr<A, Func>(nullptr, nullptr);
                                           ^
test.cc:10:47: error: template argument 2 is invalid

好像删除功能不好。

2 个答案:

答案 0 :(得分:3)

这可能是编译器错误。您使用的是旧版本的gcc。 gcc.5.4产生相同的编译错误但gcc 6.1 works fine。如果直接用Func替换void (*)(void *),则似乎是编译。如果您为std::unique_ptr<A, Func>定义别名,它似乎也有效。

您应该升级您的编译器。如果您无法做到这一点,可以尝试以下方法:

#include <memory>

class A {
};

using Func = void (*)(void *);
using MyPtr = std::unique_ptr<A, Func>;

class B {
    MyPtr b = MyPtr(nullptr, nullptr);
};

答案 1 :(得分:2)

你的代码很好。对于g ++ 4.9来说它太现代了。以下是使用g ++ 4.9

的方法
class A {
};

void Func(void*) {

}

class B {
  std::unique_ptr<A, decltype(&Func)> b = 
    std::unique_ptr<A, decltype(&Func)>(nullptr, nullptr);
};

int main(){

}