模板特化导致未定义的引用错误

template specialization causes a undefined reference error

我尝试了像下面这样的模板专业化。

#include<iostream>
using namespace std;

template<class T1, class T2>
T1 something(T2 a);

template<class T2>
double something(T2 a){
    double b;
    return b;
}

int main(){
    something<double, double>(0.0);
}

但是,这给了我一个编译错误:

In function `main':
test.cpp:(.text+0x9): undefined reference to `double something<double, double>(double)'

你能告诉我如何解决吗?

这不是模板专业化,而是 function template overloading

第一个重载有两个模板参数,第二个只有一个;当你用两个指定的模板参数调用它时,比如 something<double, double>(0.0);,第一个将在重载决策中被选择;但它没有定义然后导致 link 错误。


顺便说一句:函数模板只能完全特化,不能部分特化。在大多数情况下 function template overloading 可以很好地完成工作。