Clang ++, şablon sınıflarında bağlayıcının başarısız olmasına neden olur (ancak g ++ ile çalışır)
GCC ile iyi çalışan bir programım var, ancak bunun yerine Clang ile derlemek bağlayıcıyı bozuyor.
Sanırım benim sorunum şablon sınıflarla ilgili, bu yüzden bu küçük örneği uyguladım.
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}
{}
Onunla inşa ettiğimde g++ Point.cpp test.cpp
sorunsuz çalışıyor.
Ancak Clang ile aşağıdaki hataları verir:
$ 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)
Veya lld kullanarak:
$ 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)
Sanırım içindeki açık örneklerim Point.h
Clang için yeterince iyi değil, ama ne istediğini anlayamıyorum.
Yanıtlar
Açık örneğiniz, tanımların görülebildiği yerde olmalıdır, yani Points.cpp'nin sonunda
Gönderen class_template # Explicit_instantiation :
Açık bir örnekleme tanımı, başvurdukları sınıf, yapı veya birleşmenin somutlaştırılmasını zorlar. Programda şablon tanımından sonra herhangi bir yerde görünebilir ve belirli bir argüman listesi için programın tamamında yalnızca bir kez görünmesine izin verilir, tanı gerekmez.