【发布时间】:2013-12-11 10:59:42
【问题描述】:
我想将算法实现为派生自纯虚拟类的类,代表特定算法解决的问题类型。
一般界面如下所示:
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):
错误:‘class MyAlgorithm
’中没有名为‘WorkData’的类型 - 叮当声(3.1):
错误:“MyAlgorithm
”中没有名为“WorkData”的类型 - VS2012:
错误 C2146:语法错误:在标识符“WorkData”之前缺少“,” 请参阅对正在编译的类模板实例化“MyAlgorithm
”的引用 错误 C2065:“工作数据”:未声明的标识符 错误 C2955:“ISolutionToProblem”: 使用类模板需要模板参数列表 参见“ISolutionToProblem”的声明
【问题讨论】:
-
Data应该是什么? -
那么什么是示例用法和示例编译错误?对于更有经验的用户,我确信没有必要,但我很好奇。
-
@remyabel:我在问题中添加了错误详细信息。关于意图,通过将算法封装在一个类中,当我无法一次计算所有内容时,我可以将执行分成几个步骤。我试图用继承做的是将问题与解决方案分离。这样我就可以实现不同的算法,然后通过实例化一个或另一个来切换。
-
@remyabel:例如,不是
T ComputeSolution(),而是bool ComputeStepsTowardSolution(int maximumSteps)和T GetSolution()。
标签: c++ templates inheritance syntax nested-class