我使用了以下代码,但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
好像删除功能不好。
答案 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(){
}