C++ C++;元组链接问题:未定义引用

C++ C++;元组链接问题:未定义引用,c++,c++11,tuples,C++,C++11,Tuples,我想这段代码有严重的问题。它将编译,但不会链接 #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,

我想这段代码有严重的问题。它将编译,但不会链接

#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;
}

这怎么纠正呢?

这并不是大错特错。您的代码在C++17中完全合法。但是,在C++17之前,静态constexpr数据成员需要在类之外定义,因此请在某处查找并添加以下定义:

constexpr std::tuple<int, unsigned int, unsigned short> Table_class::table[3];
constepr std::tuple Table_class::Table[3];


通常,变量定义不应在头文件中。

这是链接错误的常见来源。 您必须在类定义之外定义表,以使链接器找到它。 一个简化的例子:

#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;
}
#包括
#包括
类表
{
公众:
constexpr static std::tuple table=std::make_tuple(1,2,3);
};
constexpr std::tuple Table_class::Table;
int main()
{

std::cout可能的解决方案副本可以工作并解决问题,但是,当作为.h或.cpp文件的一部分使用时,它有一个缺点,即必须在调用它的例程中定义该行。C++17祈祷吧!!!
#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;
}