c++ - 使用MinGW单独编译

标签 c++ templates compilation

使用本教程 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/

相关文章:

c++ - 使用 socketpair : hangs reading output from child process 进行双向通信

c# 使用泛型函数将参数传递给具有许多重载的函数

c - 关于ubuntu gcc编译器的问题

c++ - std::bind 不适用于引用?

c++ - 通用 2D 点作为 C++ 中的输入

c++ - CodeLite 不会检测(安装)MinGW——即使手动配置也不会编译

C++:在子类中重新定义一个或另一个操作

c++ - 异常的复杂性

c++ - gtk_window_set_icon_from_file() 无法正常工作

c++ - 在 gcc 上没有警告的情况下确定类方法的返回类型