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

时间:2016-08-11 04:12:21

标签: 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, 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

如何纠正?

2 个答案:

答案 0 :(得分:4)

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

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

demo

像往常一样,变量定义不应该在头文件中。

答案 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;
}