奇怪的递归静态成员函数作为模板函数参数

时间:2016-03-20 21:07:01

标签: c++

这是一个相当模糊的模板角落,但我遇到了它,并想知道我是否理解发生了什么。

因此,您可以为模板提供非类型参数,包括函数指针,这样就可以了

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;

1 个答案:

答案 0 :(得分:2)

您无法使用Baz,因为在使用时它是incomplete type。 换句话说,当你尝试使用成员方法(好吧,引用它)时,你仍然在定义你的类,我强烈怀疑消息错误是说你完全一样。