模板函数被其他函数调用专门化



我将类Foo定义为:

foo:

class Foo
{
public:
Foo() {}
~Foo() {}
double Compute1(const double& n) const;
template<int Dim>
double Compute2(const double& n) const;
};

foo.cpp:

double Foo::Compute1(const double& n) const
{
return Compute2<3>(n);
}
template<int Dim>
double Foo::Compute2(const double& n) const
{
return pow(n, Dim);
}

我认为当Compute1调用Dim=3时,Compute2已经被专门用于Dim=3。但是当我打电话的时候:

Foo comp;
double a = comp.Compute2<3>(10.0);

编译器说

undefined reference to `double Foo::Compute2<3>(double const&) const'

在这种情况下我错了什么?

原因是编译器在使用模板函数时需要知道它的定义,而不仅仅是在声明它的时候。当你声明一个模板函数时,编译器只生成一个"骨架"。函数的;它不会生成任何实际的代码。

调用模板函数时,编译器需要为该函数生成实际代码。为了做到这一点,它需要有函数的定义,而不仅仅是声明。

因此,在您的示例中,当您从Compute1调用Compute2时,编译器需要有Compute2的定义,以便为其生成代码。但是,Compute2的定义在foo.cpp文件中,而不是在foo.h文件中。所以编译器找不到它,你会得到一个错误。

的解决方案是将模板函数的定义放在头文件中,而不是源文件中。这样,当您从另一个文件调用该函数时,编译器将拥有该定义并能够生成代码。

最新更新