【发布时间】:2014-06-17 23:36:54
【问题描述】:
我正在尝试使以下代码工作
template < class __derived, class __object = typename __derived::Object >
struct Base {
using Derived = __derived;
using Object = __object;
void function(Object o) { return Derived::function(s); }
}
//template < class __derived >
//struct Base {
// using Derived = __derived;
// using Object = typename Derived::Object;
// void function(Object o) { return Derived::function(s); }
//}
template < class __object >
struct Derived : public Base< Derived< __Object > > {
using Object = __object;
void function(Object o) { ... }
}
我通过声明来实例化一个对象
Derived<double> obj;
问题是,编译器声称无法在Derived 类中找到符号Object,同时推导Base 类的第二个模板参数。注释版本也会产生同样的错误。
我试图在 Eigen3 代码的启发下执行此操作,特别是他们使用的 CRTP(Curiously Recurring Template Pattern)以避免使用虚函数。 Eigen3 实际上使用了 traits 类,但我不知道如何在当前情况下模仿它。
有人对此有什么建议吗?提前致谢!
【问题讨论】:
-
Derived 无法实例化
Object,直到实例化Base,但Base无法实例化,因为Derived::Object尚不存在。是的,使用特征类。 -
请不要使用带有双下划线的标识符。这些是为 C++ 实现(编译器/库)保留的。
-
这是什么?盗梦空间的 C++ 版本?
-
@Praetorian 我认为是 IRTIP。无限循环的模板实例化模式。
标签: c++ templates subclassing crtp