我有三个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
中使用它时链接器找不到它?
我该如何解决这个问题?
答案 0 :(得分:0)
不要将两个文件用于模板,只使用一个:sort.hpp 有一种解决方法,但不建议使用。