C++ 如何避免模板化虚拟方法?

C++ 如何避免模板化虚拟方法?,c++,templates,C++,Templates,我无法实现以下功能: class Based { public: template <typename T> void foo(T t) { boo(t); } template <typename T> virtual void boo(T t) = 0; // Error! }; class Derived : public Based { public: template <typename T> void boo(T

我无法实现以下功能:

class Based {
  public:
    template <typename T> void foo(T t) { boo(t); }
    template <typename T> virtual void boo(T t) = 0; // Error!
 };

class Derived : public Based {
  public:
    template <typename T> void boo(T t) {
      std::cout<<"Derived::boo called\n";
    }
};

int main() {

  Derived derived;
  derived.foo(0);
  derived.foo('c');
  //etc.
}
基于类{
公众:
模板void foo(T){boo(T);}
模板虚空boo(T)=0;//错误!
};
派生类:基于公共的{
公众:
模板无效boo(T){

出于我的目的,我找到了这个解决方案

template <typename X>
class Based {
  public:
    template <typename T> void foo(T t) { static_cast<X *>(this)->boo(t); }
};

class Derived : public Based<Derived> {
  public:
    template <typename T> void boo(T t) {
      std::cout<<"Derived::boo called\n";
    }
};

int main() {

  Derived derived;
  derived.foo(0);
  derived.foo('c');
  //etc.
}
模板
基于类{
公众:
模板void foo(T){static_cast(this)->boo(T);}
};
派生类:基于公共的{
公众:
模板无效boo(T){

std::Cout这种情况下的通常解决方案涉及某种类型的基于类型擦除的方法。实际解决方案取决于每种情况。没有适用于每种情况的通用答案。该问题没有提供足够的细节以形成答案。给出的示例没有提供足够的细节l、 很可能,。您可以使用类模板。将类声明为模板。在类方法中使用传递给类实例的类型。这样,您也可以使用模板获得纯虚拟函数。@sagar,谢谢!我想这正是我需要的。CRTP和静态分派可能会有所帮助。