出于某种原因,我必须将value作为类型指定的模板类从它自身返回。但问题是模板类继承自非模板类,其中有一个方法返回类型指定模板类的值。
应该是这样的:
class Base
{
// ...
_Int Foo() = 0;
};
template<typename T>
class Derived
: public Base
{
public:
// ...
_Int Foo() override
{
// ...
}
};
typedef Derived<int> _Int;
所以我的问题是:有没有办法可以帮助我在定义之前使用指定类型的模板类?
答案 0 :(得分:3)
要声明函数的返回类型,您不需要该类型的定义,只需要声明它的声明。这意味着你可以这样做:
template <class T>
class Derived;
typedef Derived<int> _Int;
class Base
{
// ...
virtual _Int Foo() = 0;
};
template<typename T>
class Derived
: public Base
{
public:
// ...
_Int Foo() override
{
// ...
}
};
两个附注,与问题无关:
virtual
声明中的代码遗失Foo
。
任何以下划线后跟大写字母开头的名称都保留给C ++实现(编译器和标准库),不得在用户代码中使用。您应该将名称_Int
更改为其他名称。
同样保留包含两个连续下划线的名称,并以全局范围保留以下划线开头的名称。
答案 1 :(得分:2)
这是curiously recurring template pattern的一个实例,可以通过将派生类作为基类的模板参数来使用:
template<typename Int>
class Base
{
// ...
virtual Int Foo() = 0;
};
然后在继承时显式传递:
template<typename T>
class Derived
: public Base<Derived<T>>
{
public:
// ...
Derived<T> Foo() override
{
// ...
}
};