Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何转发声明模板实例成员函数_C++_Templates_C++17 - Fatal编程技术网

C++ 如何转发声明模板实例成员函数

C++ 如何转发声明模板实例成员函数,c++,templates,c++17,C++,Templates,C++17,带有模板成员函数的CRTP接口,调用时出现问题 实现模板成员函数,因为没有转发声明 模板成员函数 类如果是接口,则类Src是实现 template<class T_Src> struct IF { template<class T> static void f1() { T_Src::template imp_f1<T>(); } template&l

带有模板成员函数的CRTP接口,调用时出现问题 实现模板成员函数,因为没有转发声明 模板成员函数

类如果是接口,则类Src是实现

    template<class T_Src>
    struct IF {


        template<class T>
        static void f1()
        {
            T_Src::template imp_f1<T>();
        }

template<class T>
    inline void f3()
    {       
        /*this line does not compile*/
        static_cast<T_Src*>(this)->imp_f3<T>();
    }
}


struct Src:public IF<Src>
{
    template<class T>
    static void imp_f1()
    {

    }



    template<class T>
    inline void imp_f3()
    {

    }

};
模板
结构如果{
模板
静态空隙f1()
{
T_Src::template imp_f1();
}
模板
内联void f3()
{       
/*这一行不编译*/
静态_cast(this)->imp_f3();
}
}
struct Src:public IF
{
模板
静态无效imp_f1()
{
}
模板
内联无效imp_f3()
{
}
};
对于静态函数接口实现,工作正常,如IF::f1

但是对于IF::f3,我得到了MSVC错误

C2760:语法错误:意外标记“'),应为“表达式”

总之,这适用于全局和静态成员模板函数,但对于类成员模板函数,似乎需要转发声明

不介意的解决方案,包括使用一些额外的模板魔术来绕过这个问题,如

然而,这一修正对我来说毫无用处

目前正在尝试避免我的CRTP接口因无法在接口中使用实例模板函数而受到限制


干杯

您必须在
imp_f3()
之前添加
template
关键字,就像您为
T_Src::template imp_f1()所做的那样:

static_cast(this)->模板imp_f3();

查看解释。

您必须在
imp\u f3()
之前添加
template
关键字,就像您在
T\u Src::template imp\u f1()中所做的那样:

static_cast(this)->模板imp_f3();

请看一看解释。

投票结果很奇怪……两个代码段之间的差异不仅是静态调用,而且
template
关键字缺失。投票结果很奇怪……两个代码段之间的差异不仅是静态调用,而且
template
关键字缺失。。
static_cast<T_Src*>(this)->template imp_f3<T>();