C ++链接器错误:使用函数模板时找不到符号

时间:2016-12-15 10:02:41

标签: c++ templates linker

我有三个c ++文件,sort.cpp定义了一个冒泡排序函数,它接受一个数组,数组的长度和用于进行比较的函数。 sort.h包含命名空间内的函数原型。 main.cpp用于测试实现。

sort.h:

#ifndef SORT_H
#define SORT_H

namespace sort {
    template <typename T>
    void bubble(T*, int, bool (*)(T, T));
}

#endif

sort.cpp:

#include "sort.h"

template <typename T>
void sort::bubble(T *array, int length, bool (*compare)(T, T)) {
    while (length != 0) {
        int newLength {0};
        for (int i {0}; i < length - 1; ++i) {
            if (compare(array[i], array[i+1])) {
                T temp {array[i]};
                array[i] = array[i+1];
                array[i+1] = temp;
                newLength = i + 1;
            }
        }
        length = newLength;
    }
}

main.cpp中:

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

bool larger(int x, int y) {
    return x > y;
}

int main() {
    int arr[] {3, 5, 1, 3, 7, 2};
    sort::bubble(arr, 6, larger);
    for(const auto e: arr)
        std::cout << e << ' ';
    std::cout << '\n';
    return 0;
}

当我使用g++ main.cpp sort.cpp -std=c++11编译时,我收到错误

Undefined symbols for architecture x86_64:
  "void sort::bubble<int>(int*, int, bool (*)(int, int))", referenced from:
      _main in main-767bbd.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

我是否收到错误,因为编译器在编译sort.cpp时不知道我将使用哪些类型?所以编译器不会从模板生成任何函数,然后当我在main.cpp中使用它时链接器找不到它?

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

不要将两个文件用于模板,只使用一个:sort.hpp 有一种解决方法,但不建议使用。