我想将算法实现为派生自纯虚拟类的类,代表特定算法解决的问题类型。
通用界面如下所示:
template<typename A, typename B>
class ISolutionToProblem
{
public:
virtual void Init(const A & input, const B & param) = 0;
virtual const B & ComputeSolution() = 0;
virtual ~ISolutionToProblem() {}
};
其实现例如是:
template<typename T>
class MyAlgorithm:
public ISolutionToProblem<typename MyAlgorithm<T>::WorkData, T>
{
public:
struct WorkData { /* Stuff using T... */ };
virtual void Init(const WorkData & input, const T & param);
virtual const T & ComputeSolution();
virtual ~MyAlgorithm();
};
(更具体地说,问题实际上是路径查找,但我认为这不相关)
我的问题是继承部分:我使用嵌套结构作为模板参数,无论我如何很好地尝试与编译器交谈,它都会拒绝编译我的代码。
我可以偷懒,只是将内部结构放在类之外,但如果可能的话,我更希望它整齐地放置在类中。
- 那么我想做的事情实际上是可能的吗(在 C++98 中)?
- 如果是的话我应该怎么写呢? (如果你让我理解为什么语法不接受上面的形式,那就加分了)
- 否则我做错了什么? (我的设计一开始就有缺陷吗?)
这是编译器错误的样子。
- 克++(4.8):
error: no type named ‘WorkData’ in ‘class MyAlgorithm<int>’
- 铿锵声(3.1):
error: no type named 'WorkData' in 'MyAlgorithm<T>'
- VS2012:
error C2146: syntax error : missing ',' before identifier 'WorkData'
see reference to class template instantiation 'MyAlgorithm<T>' being compiled
error C2065: 'WorkData' : undeclared identifier
error C2955: 'ISolutionToProblem' :
use of class template requires template argument list
see declaration of 'ISolutionToProblem'
我认为你的问题是编译器不知道内部类是什么样子,直到它定义了外部类并且外部类是用内部类作为模板参数定义的。我不能百分百确定这不能发挥作用。这CRTP是一个与此类似的已知有效的示例。
模板可用于创建继承层次结构,但不应在层次结构的定义中使用。如果这听起来令人困惑,那是因为事实确实如此。继承和模板类不能很好地混合。请注意,即使 CRTP 使用继承和模板,它也不使用虚拟函数。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)