gpt4 book ai didi

c++ - Clang++ 使链接器在模板类上失败(但它适用于 g++)

转载 作者:行者123 更新时间:2023-12-04 02:29:04 26 4
gpt4 key购买 nike

我有一个程序可以很好地与 GCC 配合使用,但使用 Clang 编译它会使链接器失败。

我认为我的问题出在模板类上,所以我实现了这个小示例。

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

点.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}
{}

当我使用 g++ Point.cpp test.cpp 构建它时,它没有问题。

但是对于 Clang,它会给出以下错误:

$ 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)

或者,使用 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)

我想我在 Point.h 中的显式实例化对 Clang 来说不够好,但我想不出它想要什么。

最佳答案

您的显式实例化应该在定义可见的地方,所以在 Points.cpp 的末尾

来自 class_template#Explicit_instantiation :

An explicit instantiation definition forces instantiation of the class, struct, or union they refer to. It may appear in the program anywhere after the template definition, and for a given argument-list, is only allowed to appear once in the entire program, no diagnostic required.

关于c++ - Clang++ 使链接器在模板类上失败(但它适用于 g++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65417446/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com