C++ 如何转发声明模板实例成员函数
带有模板成员函数的CRTP接口,调用时出现问题 实现模板成员函数,因为没有转发声明 模板成员函数 类如果是接口,则类Src是实现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
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>();