c++ 调用在派生类示例上用基类示例化的模板化函数

tzxcd3kk  于 2023-08-09  发布在  其他
关注(0)|答案(1)|浏览(85)

我的问题与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变量(以避免增加编译时间)?

wz3gfoph

wz3gfoph1#

我有一个模板化的函数,它的代码相对较重,因此我在一个单独的.cpp文件中定义它,并显式地示例化它以获得我需要的类型:
因此,只需暴露这些类型的重载:

void foo(Type1&);
void foo(Type2&);

字符串
并在源文件中,转发到您的模板实现:

template <typename T>
void fooImpl(T &arg)
{
    // Long code
}

void foo(Type1 &arg) { fooImpl(arg); }
void foo(Type2 &arg) { fooImpl(arg); }

相关问题