Я хочу использовать указатель в качестве аргумента шаблона. В общем, это нормально работает. Но, кроме того, я хочу, чтобы эти указатели были объявлены через другой шаблонный класс.
У меня он работает нормально на G CC, но не работает на Clang.
Вот небольшая программа для демонстрации ( живая ссылка ):
template <size_t ID = 0>
struct PointerHolderT {
static thread_local char *smt_pStorage;
};
template <size_t ID>
thread_local char *PointerHolderT<ID>::smt_pStorage = nullptr;
template<char **ppData>
struct MyClass {
static void foo() {
cout << "this is my ptr: " << ppData << endl;
}
};
int main() {
MyClass<&PointerHolderT<123>::smt_pStorage>::foo();
return 0;
}
Ошибка:
error: non-type template argument of type 'char **' is not a constant expression
Как вы можете видеть из более подробного примера по живой ссылке, clang отлично справляется с этим, когда это простой глобальный указатель, и когда это указатель внутри простой структуры. Проблемы возникают только при использовании указателя внутри шаблонной структуры.
- Это ошибка clang?
- Или то, что я делаю незаконно, но G CC это разрешает?
- Кто-нибудь знает обходной путь , чтобы я мог заставить это работать на clang?