使用本教程 Makefile我想构建一个单独编译的简单程序,主要问题是 IDE Eclpse Indigo C\C++ (prespective) 或 MinGW 我无法编译文件。我得到的错误是:
undefined reference to double getAverage<int, 85u>(int (&) [85u])'
undefined reference to int getMax<int, 85u>(int (&) [85u])'
undefined reference to int getMin<int, 85u>(int (&) [85u])'
undefined reference to void print<int, 85u>(int (&) [85u])'
undefined reference to void sort<int, 85u>(int (&) [85u])'
undefined reference to void print<int, 85u>(int (&) [85u])'
main.cpp 文件是这样的:
#include "Tools.h"
#include <iostream>
using namespace std;
int main(int argc,char* argv[])
{
int numbers[] = {1,-2,7,14,5,6,16,8,-2,7,14,5,6,16,8,-2,7,14,5,6,16,8,-2,7,14,5,6,16,8,-2,7,14,5,6,16,8,-2,7,14,5,6,16,8,-2,7,14,5,6,16,8,-2,7,14,5,6,16,8,-2,7,14,5,6,16,8,-2,7,14,5,6,16,8,-2,7,14,5,6,16,8,-2,7,14,5,6,16,8};
cout <<"Average = "<< getAverage(numbers) << endl;
cout <<"Max element = "<< getMax(numbers) << endl;
cout <<"Minimal element = "<< getMin(numbers) << endl;
print(numbers);
sort(numbers);
print(numbers);
return 0;
}
我有一个 Tools.h 文件:
#ifndef TOOLS_H_
#define TOOLS_H_
#include <iostream>
int getBigger(int numberOne,int numberTwo);
template <typename T,size_t N> double getAverage(T (&numbers)[N]);
template <typename T,size_t N> T getMax(T (&numbers)[N]);
template <typename T,size_t N> T getMin(T (&numbers)[N]);
/**
* Implementing a simple sort method of big arrays
*/
template <typename T,size_t N> void sort(T (&numbers)[N]);
/**
* Implementing a method for printing arrays
*/
template <typename T,size_t N> void print(T (&numbers)[N]);
#endif
最佳答案
当您编译 Tools.cpp 时,您的编译器不知道您在 main.cpp 中使用的模板参数。因此它不会编译与此模板相关的任何内容。
您需要包含来自使用它们的编译单元的这些模板定义。文件 Tools.cpp 通常被重命名为 Tools.inl 之类的名称,以表明它既不是头文件也不是单独的编译单元。
编译单元“main.cpp”可能如下所示:
#include "tools.h"
#include "tools.inl"
main()
{
int number[] = {1,2,3};
getaverage(numbers);
}
由于编译器识别了所需的特化,因此它可以从实现文件生成代码。
关于c++ - 使用MinGW单独编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9065018/