Clang ++ membuat linker gagal di kelas template (tetapi berfungsi dengan g ++)
Saya memiliki program yang berfungsi baik dengan GCC, tetapi mengompilasinya dengan Clang malah membuat linker gagal.
Saya pikir masalah saya adalah dengan kelas template, jadi saya menerapkan contoh kecil ini.
test.cpp
:
#include "Point.h"
int main()
{
Point<int> p1;
Point<int> p2{ 3, 6 };
}
Point.h
:
#ifndef POINT_H
#define POINT_H
template<typename T>
class Point {
T x, y;
public:
Point();
Point(T, T);
};
template class Point<int>;
template class Point<float>;
#endif
Point.cpp
:
#include "Point.h"
template<typename T>
Point<T>::Point()
: x{0}, y{0}
{}
template<typename T>
Point<T>::Point(T t_x, T t_y)
: x{t_x}, y{t_y}
{}
Saat saya membuatnya g++ Point.cpp test.cpp
, ia bekerja tanpa masalah.
Tetapi dengan Clang, ini memberikan kesalahan berikut:
$ clang++ Point.cpp test.cpp
/usr/bin/ld: /tmp/test-8ab886.o: in function `main':
test.cpp:(.text+0x1a): undefined reference to `Point<int>::Point()'
/usr/bin/ld: test.cpp:(.text+0x2d): undefined reference to `Point<int>::Point(int, int)'
clang-11: error: linker command failed with exit code 1 (use -v to see invocation)
Atau, menggunakan lld:
$ clang++ -fuse-ld=lld Point.cpp test.cpp
ld.lld: error: undefined symbol: Point<int>::Point()
>>> referenced by test.cpp
>>> /tmp/test-f95759.o:(main)
ld.lld: error: undefined symbol: Point<int>::Point(int, int)
>>> referenced by test.cpp
>>> /tmp/test-f95759.o:(main)
clang-11: error: linker command failed with exit code 1 (use -v to see invocation)
Saya kira contoh eksplisit saya di Point.h
tidak cukup baik untuk Clang, tetapi saya tidak tahu apa yang diinginkannya.
Jawaban
Instansiasi eksplisit Anda haruslah di mana definisi terlihat, jadi di akhir Points.cpp
Dari class_template # Explicit_instantiation :
Definisi instansiasi eksplisit memaksa instansiasi class, struct, atau union yang mereka rujuk. Ini dapat muncul dalam program di mana saja setelah definisi templat, dan untuk daftar argumen yang diberikan, hanya diizinkan untuk muncul sekali dalam keseluruhan program, tidak diperlukan diagnostik.