C++ 编译此文件时出现链接错误";简单的;使用叮当和g+编程+;
我正在处理一个项目,似乎clang无法生成有效的字节码(由于链接器无法链接,在链接时找不到模板类中的一些C++ 编译此文件时出现链接错误";简单的;使用叮当和g+编程+;,c++,c++11,g++,constexpr,clang++,C++,C++11,G++,Constexpr,Clang++,我正在处理一个项目,似乎clang无法生成有效的字节码(由于链接器无法链接,在链接时找不到模板类中的一些静态constexpr) 我可以在类中使用静态getter来修复它,但这会导致一些非常难看/重载的代码 下面是一个“最小”的代码示例,它使bug(是bug吗?)出现。 不幸的是,在这里,g++将产生相同的链接错误 我在问这是否是一个编译器错误,或者我只是做错了什么,是否有一个解决方案来避免这个错误。 (如果我做错了什么,为什么在我更大的项目中使用相同的结构??) 注意:更大的项目在github
静态constexpr
)
我可以在类中使用静态getter来修复它,但这会导致一些非常难看/重载的代码
下面是一个“最小”的代码示例,它使bug(是bug吗?)出现。
不幸的是,在这里,g++将产生相同的链接错误
我在问这是否是一个编译器错误,或者我只是做错了什么,是否有一个解决方案来避免这个错误。
(如果我做错了什么,为什么在我更大的项目中使用相同的结构??)
注意:更大的项目在github上命名为yaggler
,但仍处于生命的早期
#包括
#包括
//向量类示例
结构向量2
{
constexpr向量2(无符号整数x=0,无符号整数y=0):x(x),y(y){}//
无符号整数x;
无符号整数y;
};
结构向量3:公共向量2//uh;)
{
constexpr vector3(unsigned int_x=0,unsigned int_y=0,unsigned int_z=0):vector2(_x,_y),z(_z){}//
无符号整数z;
};
//简单模板泛型向量类型
//我们可以制作一个更通用的,但这需要像元组这样的东西。
模板
结构向量
{
静态断言(!(sizeof…(Vals)+1),“[…]”;
};
模板
结构向量
{
使用vec_type=unsigned int;
静态constexpr unsigned int value=X;
};
模板
结构向量
{
使用vec_type=vector2;
静态constexpr vector2值=vector2(X,Y);
};
模板
结构向量
{
使用vec_type=vector3;
静态constexpr vector3值=vector3(X,Y,Z);
};
//简单的包装
模板
构造一些包装器
{
静态constexpr typename V::vec_type value=V::value;
};
//将某物打印到标准输出的伪函数。
void do\u something(int32\u t id、常量向量3和值)
{
std::cout用于2和3个模板参数的vector
类模板的专门化得到了文本类型(vector2
和vector3
)的static constepr
数据成员值
,它们没有命名空间范围定义
您将需要它们,因为在传递给do\u something
函数时,当它绑定到引用参数时,odr使用value
§9.4.2/3[class.static.mfct]
如果非易失性常量static
数据成员是整型或枚举类型,则其在类中的声明
定义可以指定一个括号或相等的初始值设定项
,其中每个初始值设定项子句
都是赋值-
表达式
是一个常量表达式(5.19)。可以在
使用constexpr
规范定义类别;如果是,其声明应指定大括号或同等初始值设定项
其中每个初始值设定项子句
是一个赋值表达式
是一个常量表达式。[注:两者都是
在这些情况下,构件可能会以恒定的表达式出现。-结束注释]构件仍应定义
在名称空间范围内,如果程序中使用了odr(3.2),则名称空间范围定义不应
包含初始值设定项。
编辑:纠正我自己,实际上是some\u wrapper::value
需要这个定义(尽管出于上述原因)。因此,您需要的是some\u wrapper
定义之后的命名空间范围中的这个:
template<typename V>
constexpr typename V::vec_type some_wrapper<V>::value;
模板
constexpr typename V::vec_type some_wrapper::value;
在那之后,你的代码。wow。我不认为我必须为static constexpr
成员这样做。非常感谢完整的答案和解决方案!!(这有效地解决了“更大项目”中的链接器错误)
template<typename V>
constexpr typename V::vec_type some_wrapper<V>::value;