模板类中静态成员变量的c ++ Type别名

时间:2019-06-25 13:16:24

标签: c++ templates c++17 type-alias

因此,我创建了一些演示代码来显示我的问题(view on godbolt):

#include <vector>

template <class T>
struct Test {
    using Vec = std::vector<T>;
    static Vec data; 
};

template <class T>
Test<T>::Vec data = {};

这会出现以下错误:

<source>:10:1: error: missing 'typename' prior to dependent type name 'Test<T>::Vec'

Test<T>::Vec data = {};

^~~~~~~~~~~~

我没有运气就尝试了几种不同的排列方式。

例如,此版本似乎可以在gcc和Visual Studio 2017(view on godbolt)中使用:

#include <vector>

template <class T>
struct Test {
    template <class U>
    using Vec = std::vector<T>;
    static Vec<T> data;
};

template <class T>
Test<T>::Vec<T> data = {};

但是,c不喜欢它。

然后是(view on godbolt)之类的东西:

#include <array>

struct SomeStruct {
    static constexpr auto max_size() {
        return sizeof(SomeStruct);
    }
};

template <class T>
struct Test {
    using Arr = std::array<unsigned, SomeStruct::max_size()>;
    static Arr data;
};

template <class T>
Test<T>::Arr data = {};

什么都不喜欢,但是如果您将Arr更改为(view on godbolt):

template <class T>
struct Test {
    template <class U>
    using Arr = std::array<unsigned, SomeStruct::max_size()>;
    static Arr<T> data;
};

template <class T>
Test<T>::Arr<T> data = {};

gcc和Visual Studio很高兴,但是clang仍然不喜欢它。

所以我的问题是,为静态成员变量创建类型别名时的经验法则是什么,我将如何解决上述问题,以便它们在所有编译器上都能正常工作? (c ++ 17及以上可以)

0 个答案:

没有答案