c++ - odr 使用的变量的模板 static constexpr 定义

标签 c++ templates c++11 gcc constexpr

实际代码更复杂,但我能够将其简化为这个示例。

一切正常,直到我尝试获取指向 MyPackets_t::types 的指针(取消对 main() 中对 foo() 的调用的注释)

此时,为了使应用程序能够链接,类型需要一个定义。

我正在努力寻找定义的正确语法。注释掉模板...应该可以解决问题。但是,它会生成错误“‘PacketCollection::types’的模板参数与原始模板不匹配”。

尝试这样的东西 - template<> constexpr int PacketCollection::types[]; - 导致另一个链接器错误,就好像该行中正在使用变量而不是声明变量一样。

我尝试使用 MyPackets_t 而不是 PacketCollection - 结果相同。

如果我将数据包收集设置为非模板化,那么一切都会按预期编译和运行。

我觉得我要么在这里遗漏了一些非常基本的东西,要么编译器中存在错误。我在 gcc 4.8 和 4.9 中遇到了这种行为。

Clang 3.5 对这种情况的看法略有不同:constexpr 静态数据成员“类型”的声明需要一个初始值设定项。

到目前为止我发现的唯一解决方法是使用

static constexpr std::array<int, 2> types() { return {1,2}; }

相反,但我不喜欢这个解决方案。如果变量在非模板化版本中工作(使用 header 中的初始值设定项),它也应该适用于模板化版本。

#include <iostream>

using namespace std;

class Packet_A
{
public:
    static constexpr int TYPE = 1;
};

class Packet_B
{
public:
    static constexpr int TYPE = 2;
};

template <typename T> class PacketCollection
{
public:
    static constexpr size_t size = 2;
    static constexpr int types[size] { 1, 2 };
};

typedef PacketCollection<Packet_A> MyPackets_t;

//template<typename T> constexpr int PacketCollection<Packet_A>::types[PacketCollection<Packet_A>::size];

void foo(const int* bar, size_t size)
{
    if (size >= 2)
    {
        cout << bar[0] << bar[1];
    }
}

int main(int argc, char* argv[])
{
    cout << Packet_A::TYPE;
    cout << MyPackets_t::types[0];

    //foo(MyPackets_t::types, MyPackets_t::size);

    return 0;
}

最佳答案

您应该使用T而不是Packet_A

template<typename T> constexpr int PacketCollection<T>::types[PacketCollection<T>::size];
                                                    ^                          ^

参见live example .

关于c++ - odr 使用的变量的模板 static constexpr 定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36507170/

相关文章:

c++ - 在类模板特化中使用 sizeof 模板参数包

c++ - 哪个容器使用 map 或 set 或者其他?

c++ - 代码行在两行之后不起作用

c++ - 为什么显式模板实例化的位置很重要

c++ - C++中具有O(1)搜索时间复杂度的数据结构

templates - Pug/Jade 获取给定模板中的所有变量

c++ - 您如何在非模板类中专门化没有参数的模板方法?

c++ - 通过字符串进行最优迭代

c++ - Opencv 相机分辨率问题

c++ - 使用指针数组时编程 "has stopped working"