c++ - 如何将 Base* 指针视为 Derived<T>* 指针?

标签 c++ templates types

我想将指向 Base 类的指针存储在 vector 中,然后将它们用作函数参数,它们充当特定类,请参见此处:

#include <iostream>
#include <vector>

class Base {};

template<class T>
class Derived : public Base {};

void Foo(Derived<int>* d) {
  std::cerr << "Processing int" << std::endl;
}

void Foo(Derived<double>* d) {
  std::cerr << "Processing double" << std::endl;
}

int main() {
  std::vector<Base*> vec;
  vec.push_back(new Derived<int>());
  vec.push_back(new Derived<double>());
  Foo(vec[0]);
  Foo(vec[1]);
  delete vec[0];
  delete vec[1];
  return 0;
}

这不编译:

error: call of overloaded 'Foo(Base*&)' is ambiguous

有可能让它发挥作用吗?我需要根据 vector 的 int、double 等类型以不同方式处理 vector 的元素。

最佳答案

您需要使用方法多态性,因为它是动态的,而不是函数重载,后者是静态的(编译时)。要重载模板化类型,您需要使用模板特化。

例子:

#include <iostream>
#include <vector>

class Base {
  public:
    virtual void Foo() {
      std::cerr << "Processing base" << std::endl;
    }
};

template<class T>
class Derived : public Base {};

template <>
class Derived <int> : public Base {
  public:
    void Foo() {
      std::cerr << "Processing int" << std::endl;
    }
};

template <>
class Derived <double> : public Base {
  public:
    void Foo() {
      std::cerr << "Processing double" << std::endl;
    }
};

int main() {
  std::vector<Base*> vec;
  vec.push_back(new Derived<int>());
  vec.push_back(new Derived<double>());
  vec[0]->Foo();
  vec[1]->Foo();
  delete vec[0];
  delete vec[1];
  return 0;
}

关于c++ - 如何将 Base* 指针视为 Derived<T>* 指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2660276/

相关文章:

Java:根据我的类(class)校正器的说法,为什么这是错误的?

c++ - 'constexpr' 标记的变量和静态存储持续时间的变量是否都可以通过具有推导指南的类类型来存储?

c++ - 在具有模板和继承的 C++ 中使用未声明的标识符

scala - 利用 Scala 匹配表达式中案例类的类型约束

c++ - 处理一个 12 位数字的因数需要多长时间?

c++ - 为什么 using 指令不影响 ADL?

c++ - 原子比较和有条件地减去如果少

c++ - 在编译时评估成员的位置

具有可变返回类型的 C++ 访问者模式

javascript - 使用可选属性扩展 TypeScript 类型