【发布时间】:2019-08-05 21:15:39
【问题描述】:
我创建了一个模板函数,定义如下。
template<class T>
void func(T t){ /* do stuff */ }
如果 T 从我创建的抽象类继承,我想重载这个模板。
class A {
public:
virtual void doStuff() = 0;
};
class B : public A {
virtual void doStuff(){ /* do stuff */ }
}
我尝试过使用模板特化(如下),但它仍然使用原始定义。
template<>
void func(A& a){ /* do different stuff */ } // Not called by func(B())
我也尝试过重载它,虽然这适用于整数,但不适用于我的基类。
func(int i){ /* do stuff with i */ } // Called by func(3)
func(A& a){ /* do different stuff */ } // Not called by func(B())
我猜这与 C++ 不希望将我的 B 实例隐式转换为 A 并引用它有关,但我无法找到任何解释如何解决此问题的信息。由于A有一个纯虚函数,我不能只定义func(A a)。任何帮助将不胜感激。
这是一个可以重现我正在经历的行为的示例。
#include <iostream>
template<class T>
void func(T t){
std::cout << "Template function called!" << std::endl;
}
class A {
public:
virtual void doStuff() = 0;
};
class B : public A{
public:
virtual void doStuff(){};
};
template<>
void func(const A& a){
std::cout << "Specialized template called!" << std::endl;
}
void func(const A& a){
std::cout << "Overload called!" << std::endl;
}
int main(){
B b{};
func(b);
return 0;
}
【问题讨论】:
-
这个问题很可能是因为在调用点之后声明了特化/重载。请发帖minimal reproducible example。
-
我想你可以在这里找到问题的答案:stackoverflow.com/a/28406090/246759
-
@mortenvp 这确实解释了原因,但没有解释解决方案
-
@1201ProgramAlarm 这仍然不够,因为
func<B>(B)仍然比重载func(const A&)更适合
标签: c++ templates polymorphism overloading