gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:17:56 25 4
gpt4 key购买 nike

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

一般的界面是这样的:

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):
    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 compilederror C2065: 'WorkData' : undeclared identifiererror C2955: 'ISolutionToProblem' :             use of class template requires template argument listsee declaration of 'ISolutionToProblem'

最佳答案

我认为你的问题是编译器不知道内部类是什么样子,直到它定义了外部类并且外部类是用内部类作为模板参数定义的。我不是 100% 确定这不能工作。 CRTP是一个与此类似的已知有效的示例。

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

关于c++ - 嵌套类作为C++中父类的模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20214740/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com