繁体   English   中英

嵌套类作为C ++中父类的模板参数

[英]Nested class as a template parameter of parent class in C++

我想将算法实现为从纯虚拟类派生的类,表示特定算法解决的问题类型。

通用界面如下所示:

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 <int>'中没有​​名为'WorkData'的类型 
  • 铿锵(3.1):
      错误:'MyAlgorithm <T>中没有名为'WorkData'的类型 
  • VS2012:
      错误C2146:语法错误:在标识符'WorkData'之前缺少','\n 请参阅正在编译的类模板实例化'MyAlgorithm <T>'的引用\n 错误C2065:'WorkData':未声明的标识符\n 错误C2955:'ISolutionToProblem':\n              使用类模板需要模板参数列表\n 看到'ISolutionToProblem'的声明 

我认为你的问题是编译器在定义外部类并且使用内部类作为模板参数定义外部类之前不知道内部类是什么样的。 我不是百分百肯定这不能成功。 CRTP是一个类似于已知可行的示例。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM