因此,我创建了一些演示代码来显示我的问题(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及以上可以)