2012-10-20 56 views
0

可能重复:
What is an undefined reference/unresolved external symbol error and how do I fix it?解析外部符号,混淆

我的中值函数从所述阵列的元件发现的中值如下

median.h

template <class N> 
N median (N*,size_t); 

median.cpp

#include "median.h" 
template <class N> 
N median (N* numbers,size_t size){ 
    size_t mid = size/2; 
    return size % 2 == 0? (numbers[mid] + numbers[mid-1])/2 : numbers[mid]; 
} 

主要

#include <iostream> 
#include "median.h" 

using namespace std; 

int main(){ 
    double Numbers [] = {1,2,3,4,5,6,7}; 


    size_t size = sizeof(Numbers)/sizeof(*Numbers); 

    double med = median(Numbers,size); 
    cout << med << endl; 
    return 0; 

} 

但我得到以下错误

main.obj : error LNK2019: unresolved external symbol "double __cdecl median<double>(double *,unsigned int)" ([email protected]@@[email protected]) referenced in function _main 
+0

见http://stackoverflow.com/questions/12573816/what-is-an-undefined-reference-unresolved-external-symbol-error - 12574417#12574417 –

+0

谢谢@LuchianGrigore – SacGax

回答

1

模板应在使用前由编译器实例化。在median.h中你声明了median模板,并且在media.cpp中你有它的实现,但是你没有在那个文件中使用它,所以模板不会在那个文件中实例化。另一方面main.cpp你尝试实例化模板,但没有实现,只是声明!所以编译器将无法实例化模板的实现,这是错误的原因。只需使用移动实施median.h或实例化模板median.cpp

template double median<double>(double*, size_t); 
0

您可以把一个#include "median.cpp"到主或移动执行模板头文件median.h

+0

包含一个cpp文件?这是你能给的最糟糕的建议之一。 –

+0

我不认为它是一个cpp文件,而不是一个模板实现文件。谨慎地阐述,你为什么这么想?链接也可以。 –

+0

@Olaf将模板定义与它们的声明分开绝对没有意义 - 如果有的话,它可能会在使用不够智能的编译器时以内联的方式进行。 – Cubic