【问题标题】:Nested class as a template parameter of parent class in C++嵌套类作为C++中父类的模板参数
【发布时间】: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();
};

(更具体地说,问题实际上是寻路,但我认为它不相关)

我的问题是继承部分:我使用嵌套结构作为模板参数,无论我多么好地尝试与编译器对话,它总是拒绝编译我的代码。

我可以偷懒,把内部结构放在课堂之外,但如果可能的话,我希望它整齐地放在课堂上。

  1. 那么我正在尝试做的事情实际上是否可行(在 C++98 中)?
  2. 如果是这样,我应该怎么写? (如果你让我理解为什么语法不接受上面的形式,那么加分)
  3. 否则,我做错了什么? (我的设计一开始就有缺陷吗?)

这是编译器错误的样子。

  • 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


【解决方案1】:

我认为您的问题是编译器在定义外部类之前不知道内部类的外观,并且外部类是使用内部类作为模板参数定义的。我不是 100% 确定这不能正常工作。 CRTP 是一个与此类似且已知有效的示例。

模板可用于创建继承层次结构,但不应在层次结构的定义中使用。如果这听起来令人困惑,那是因为它是。继承和模板类不能很好地混合。请注意,即使 CRTP 使用继承和模板,它也不使用虚函数。

【讨论】:

  • 是的,看起来即使编译器不需要知道外部类就可以使用内部类,但在声明继承时它没有定义。现在我在外面声明内部类,但我怀疑我的设计有问题(同时拥有虚拟和模板听起来像是使用互斥方法)。也谢谢你的链接,我不知道这个词。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-26
  • 2018-09-07
  • 2011-05-04
  • 2019-06-04
  • 2011-04-15
  • 1970-01-01
相关资源
最近更新 更多