【发布时间】:2020-07-21 12:34:45
【问题描述】:
我在我正在从事的项目的 CI 构建中遇到了一个奇怪的错误。这只发生在一个相对较旧的操作系统 (Ubuntu 16.04) 和一个不太新的编译器 (gcc 5.4.0) 上。
导致错误的代码类似于以下内容: (https://godbolt.org/z/MhY6sv)
#include <limits>
#include <string>
#define DEFAULT_INIT(x) x{defaultValue<decltype(x)>}
namespace MyProject{
template<typename T>
class Arr1 : public std::array<T, 3>{
public:
Arr1(T t1, T t2, T t3) : std::array<T, 3>{{t1, t2, t3}}{}
};
template<typename T>
class Arr2 : public std::array<T, 3>{
Arr2(T t1, T t2, T t3) : std::array<T, 3>{{t1, t2, t3}}{}
};
namespace{
template <typename T> constexpr T defaultValue = std::numeric_limits<T>::max();
template <typename T> const Arr1<T> defaultValue<Arr1<T>> = Arr1<T>{defaultValue<T>, defaultValue<T>, defaultValue<T>};
template <typename T> const Arr2<T> defaultValue<Arr2<T>> = Arr2<T>{defaultValue<T>, defaultValue<T>, defaultValue<T>};
}
class S {
public:
S() : DEFAULT_INIT(_arr1), DEFAULT_INIT(_arr2), DEFAULT_INIT(_n) {}
S(unsigned int n) : DEFAULT_INIT(_arr1), DEFAULT_INIT(_arr2), _n{n} {}
private:
Arr1<unsigned int> _arr1;
Arr1<float> _arr2;
unsigned int _n;
};
}
int main(){
return 0;
}
导致汇编错误
/tmp/ccWrYvQ2.s: Assembler messages:
/tmp/ccWrYvQ2.s:110: Error: symbol `_ZN9MyProject12_GLOBAL__N_1L12defaultValueE' is already defined
使用编译器资源管理器(并且考虑到其他 CI 构建使用更新版本的 gcc 编译没有问题)我已经看到这只发生在 gcc defaultValue<Arr1<T>> 和 defaultValue<Arr2<T>>。
由于在这个项目中,我们仍然希望(目前)使用其默认编译器支持有故障的操作系统,是否有任何解决方法可以让它正常工作?
【问题讨论】: