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和静态分派可能会有所帮助。