我认为这段代码存在严重错误。它会编译但不会链接。
#include <iostream>
#include <tuple>
class Table_class
{
public:
constexpr static std::tuple<int, unsigned int, unsigned short> table[3]
= {std::make_tuple(1, 2, 3),
std::make_tuple(4, 5, 6),
std::make_tuple(7, 8, 9)};
};
int main()
{
std::cout << std::get<0>(Table_class::table[0]);
return 0;
}
显示的错误是:
[31m/tmp/ccDiIuPv.o: In function `main':
file.cpp:(.text+0x5): undefined reference to `Table_class::table'
collect2: error: ld returned 1 exit status
Compilation Failed
如何纠正?
答案 0 :(得分:4)
这不是非常错误的。您的代码(将是)在C ++ 17中完全合法。但是,在C ++ 17之前,需要在类之外定义静态constexpr数据成员,因此找到某处并添加以下定义:
constexpr std::tuple<int, unsigned int, unsigned short> Table_class::table[3];
像往常一样,变量定义不应该在头文件中。
答案 1 :(得分:1)
它是链接错误的常见来源。 您必须在类定义之外定义表,以使链接器找到它。 一个简化的例子:
#include <iostream>
#include <tuple>
class Table_class
{
public:
constexpr static std::tuple<int, unsigned int, unsigned short> table = std::make_tuple(1, 2, 3);
};
constexpr std::tuple<int, unsigned int, unsigned short> Table_class::table;
int main()
{
std::cout << std::get<0>(Table_class::table);
return 0;
}