我的问题与this one非常相似,但我不确定相同的答案是否适用于这里。
我有一个模板化的函数,它的代码相对较重,因此我在一个单独的.cpp文件中定义它,并显式地示例化它以获得我需要的类型:
foo.h
template <typename T>
void foo(T &arg);
字符串
foo.cpp
template <typename T>
void foo(T &arg)
{
... //Long code
}
template
void foo<Type1>(Type1 &arg);
template
void foo<Type2>(Type2 &arg);
型
现在我希望也能够在Type3
对象上调用foo()
,其中Type3
是从Type2
派生的类。我可以用一个非模板化的函数做到这一点而没有问题,但是模板化的函数有链接器问题:
class Type3 : public Type2
{ ... }
void foo1(Type2 &arg)
{ ... }
...
Type3 var;
foo1(var); //Runs fine
foo(var); //Linker error
型
由于我显式地示例化了foo()
以接受Type2
变量,所以我真的不明白为什么从派生到基类的转换不会自动应用于非模板化函数。
我知道我可以通过编写foo<Type2>(var)
或foo((Type2&)var)
来运行这段代码,但是有没有一种解决方案不需要改变我调用函数的方式,也不需要显式地示例化foo
来接受Type3
变量(以避免增加编译时间)?
1条答案
按热度按时间wz3gfoph1#
我有一个模板化的函数,它的代码相对较重,因此我在一个单独的.cpp文件中定义它,并显式地示例化它以获得我需要的类型:
因此,只需暴露这些类型的重载:
字符串
并在源文件中,转发到您的模板实现:
型