Ошибка лязга? Использование указателя в качестве аргумента шаблона - PullRequest
0 голосов
/ 11 июля 2020

Я хочу использовать указатель в качестве аргумента шаблона. В общем, это нормально работает. Но, кроме того, я хочу, чтобы эти указатели были объявлены через другой шаблонный класс.

У меня он работает нормально на 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?

1 Ответ

1 голос
/ 11 июля 2020

Думаю, проблема в thread_local. Если я добавлю thread_local к pData, он не скомпилируется.

...