这是一个相当模糊的模板角落,但我遇到了它,并想知道我是否理解发生了什么。
因此,您可以为模板提供非类型参数,包括函数指针,这样就可以了
using OP = int(*)(int);
template <OP operation> struct Foo
{
int do_op( int x )
{
return( operation( x ) );
}
};
这可以在从Foo
派生的类中使用如下int add_one( int x ) { return( x + 1 ); }
struct Bar : public Foo<add_one> { };
我的问题是我应该能够使用派生类的静态成员函数吗?
struct Baz : public Foo<Baz::member_add_one>
{
static int member_add_one( int x ) { return( x + 1 ); }
};
这给出了编译器错误,至少在VS 2015 Update 2 RC上。那么编译器是否正确,如果是,为什么呢?
编译错误是&#34;错误是错误C2065:&#39; mem_add_one&#39;:未声明的标识符&#34;
答案 0 :(得分:2)
您无法使用Baz
,因为在使用时它是incomplete type。
换句话说,当你尝试使用成员方法(好吧,引用它)时,你仍然在定义你的类,我强烈怀疑消息错误是说你完全一样。