gpt4 book ai didi

c++ - 由于无法解析模板参数导致多态性失败?

转载 作者:行者123 更新时间:2023-11-28 02:03:46 27 4
gpt4 key购买 nike

我知道这看起来很复杂,但我希望有人能在这里指出我的错误。我敢肯定这种设计会在您的某些口中留下不好的味道,我很高兴听到设计替代方案。但形式来自问题域中的建模。

我确定我很傻,但是模板与继承的结合方式让我感到困惑。下面是一些经过简化的代码,并附有说明:

// main.cpp

#include <cstdio>

template <typename POD>
class A {
public:
POD data;
POD get_a() { return data; }
};

template <typename T>
class B {
public:
virtual void do_something_with_an_A_child(const T&) = 0;
};

class ADerived : public A<float> {
public:
ADerived(float a) { data = a; }
};

class BDerived : public B<ADerived> {
public:
virtual void do_something_with_an_A_child(const ADerived& someA) {
printf("A bit of A-type's data: %f\n", someA.data);
}
};

template <typename POD>
class Aggregator {
public:
A<POD>* instanceOfA;
B<A<POD>>* instanceOfB;
Aggregator(A<POD>* anA, B<A<POD>>* aB) : instanceOfA(anA), instanceOfB(aB) {}
};

int main() {
ADerived myADerived(3.14159f);
BDerived myBDerived;

Aggregator<float> myAggregator(&myADerived, &myBDerived);

return 1;
}

所以 A是一个类模板,其签名只是一些内置类型。 (在我的特殊情况下,A 具有对其内部数据进行操作的方法。)B 类旨在 promise 为某些操作提供接口(interface),这些操作适用于 A<.> 的特定实例.所以,在上面的代码中,你看到我定义了 AB作为模板类,然后创建从这些模板类继承的类,给出 ADerivedBDerived .

(在实际情况下,A代表一个数学模型和一些数据,B是一个对模型进行数学优化的接口(interface)。)

现在,一个应该链接到 ADerivded 实例的类和 BDerived (为了基于它们的接口(interface)创建通用算法)我调用了 Aggregator ,它只是在构造函数中获取一些指针。我只要Aggregator需要了解 POD类型,因为它只是为了操纵接口(interface),而不用太担心对象包含什么。

我从 clang++ 得到以下编译器错误与 -std=c++14 :

main.cpp:42:21: error: no matching constructor for initialization of 'Aggregator<float>'
Aggregator<float> myAggregator(&myADerived, &myBDerived);
^ ~~~~~~~~~~~~~~~~~~~~~~~~
main.cpp:35:3: note: candidate constructor not viable: no known conversion from 'BDerived *' to 'B<A<float> > *' for 2nd argument
Aggregator(A<POD>* anA, B<A<POD>>* aB) : instanceOfA(anA), instanceOfB(aB) {}
^

意思很清楚,但我不知道为什么它看不到BDerivedB<A<float>> .我的意思是,它特别是一个 B<ADerived> ,但是 ADerived是一个 A<float> ,因此一个 BDerived应该被视为 B<A<float>> .这显然不是这种情况,所以要么我在做一些愚蠢的事情并希望有人指出,要么这在 C++ 中是不可能的,我需要一些替代设计建议。

最佳答案

模板参数被静态解析为精确类型。因此 B<ADerived>不会衰减到B<A<POD>>即使ADerivedA<POD> 的后代.您可以通过以下方式解决此问题:

  • 再取一个模板参数,T , 在 Aggregator ,并可选择确保(使用 std::enable_if<>std::is_base<> ) A<POD>T 的基础, 或
  • 曝光TB使用 typedef , 然后取 TAggregator和存储 TA<B::T>Aggregator .

关于c++ - 由于无法解析模板参数导致多态性失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38361075/

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