【发布时间】:2018-09-13 13:41:58
【问题描述】:
假设我有以下两个类:
template<typename T>
struct Base
{
void foo();
};
struct Derived : Base<Derived> {};
我可以这样做:
void (Derived::*thing)() = &Derived::foo;
编译器很高兴(正如我所料)。
当我把它放在两个级别的模板中时,它突然爆炸了:
template<typename T, T thing>
struct bar {};
template<typename T>
void foo()
{
bar<void (T::*)(),&T::foo>{};
}
int main()
{
foo<Derived>(); // ERROR
foo<Base<Derived>>(); // Works fine
}
这失败了:
non-type template argument of type 'void (Base<Derived>::*)()' cannot be converted to a value of type 'void (Derived::*)()'
为什么简单的案例成功而复杂的案例失败了?我相信这与this 问题有关,但我不完全确定......
【问题讨论】:
标签: c++ templates language-lawyer member-function-pointers