Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 编译此文件时出现链接错误";简单的;使用叮当和g+编程+;_C++_C++11_G++_Constexpr_Clang++ - Fatal编程技术网

C++ 编译此文件时出现链接错误";简单的;使用叮当和g+编程+;

C++ 编译此文件时出现链接错误";简单的;使用叮当和g+编程+;,c++,c++11,g++,constexpr,clang++,C++,C++11,G++,Constexpr,Clang++,我正在处理一个项目,似乎clang无法生成有效的字节码(由于链接器无法链接,在链接时找不到模板类中的一些静态constexpr) 我可以在类中使用静态getter来修复它,但这会导致一些非常难看/重载的代码 下面是一个“最小”的代码示例,它使bug(是bug吗?)出现。 不幸的是,在这里,g++将产生相同的链接错误 我在问这是否是一个编译器错误,或者我只是做错了什么,是否有一个解决方案来避免这个错误。 (如果我做错了什么,为什么在我更大的项目中使用相同的结构??) 注意:更大的项目在github

我正在处理一个项目,似乎clang无法生成有效的字节码(由于链接器无法链接,在链接时找不到模板类中的一些
静态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;