我想将算法实现为从纯虚拟类派生的类,表示特定算法解决的问题类型.
通用界面如下所示:
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中)?
>如果是这样,我该怎么写呢? (如果你让我理解为什么语法不接受上面的表格,奖励积分)
>否则,我做错了什么? (我的设计有缺陷吗?)
以下是编译器错误的样子.
> g(4.8):
error: no type named ‘WorkData’ in ‘class MyAlgorithm<int>’
> clang(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使用继承和模板,它也不使用虚函数.