这个问题与最近关于SO的问题有关:How to instantiate a member function pointer?
以下代码
struct MyClass {void doThings() {}};
template<class MemberFunc>
struct Foo {
MyClass object_;
void call() {
auto ptr = MemberFunc{};
(object_.*ptr)();
}
};
int main() {
Foo<decltype(&MyClass::doThings)> foo;
foo.call();
}
应该(imo)编译,尽管由于解除引用指向函数成员的null初始化指针而导致段错误。链接问题的答案解释了为什么segfault以及如何解决它。但是,我不明白为什么代码不在gcc 6.2下编译,编译器吐出错误
错误:&#39; MemberFunc ptr&#39; auto ptr = MemberFunc {};
中的类型不完整
此处没有不完整的类型,当编译器执行模板实例化时,MemberFunc
已完全定义。
另一方面,Clang 3.7编译它(和预期的段错误一样),见here。