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

3
我尝试了下面的模板特化。

我尝试了下面的模板特化。

#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)'

你能告诉我如何解决这个问题吗?

我可以编译这段代码而不出现错误 - 你确定你正在编译的是完全相同的代码吗?你是如何进行编译的? - BoBTFish
@BoBTFish,非常抱歉,我复制了不同的内容。现在,我已经编辑好了。 - orematasaburo
请提供一个 [mcve]。 - Passer By
4
这并不是专业化,实际上是过载:https://dev59.com/OWsz5IYBdhLWcg3wNE5q#8061522 - BoBTFish
你遇到这个错误是因为你调用了一个声明但未定义的函数(重载)。 - Daniel Langr
1个回答

5
这不是模板特化,而是函数模板重载
第一个重载有两个模板参数,第二个只有一个;当你用两个指定的模板参数调用它,比如something<double, double>(0.0);,第一个会在重载决议中被选择;但它没有定义,导致链接错误。

顺便提一句:函数模板只能进行完全特化,无法进行部分特化。而且在大多数情况下,函数模板重载都可以很好地完成工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接