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

2023-11-22

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

通用界面如下所示:

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. 否则我做错了什么? (我的设计一开始就有缺陷吗?)

这是编译器错误的样子。

  • 克++(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(使用前将#替换为@)

C++中嵌套类作为父类的模板参数 的相关文章

随机推荐