Я боролся с этим уже пару дней. Я портирую некоторый код на MacOS/AppleClang, и у нас есть очень тяжелый шаблонный код, который правильно строится на MSVC, но не работает на clang (по понятным причинам, потому что, после прочтения, наш код не соответствует стандарту). Но я действительно не могу найти способ сделать это правильно.
Вот исходный код, который отлично компилируется и работает в MSVC:
template класс MemoryDataLayout { //Делай что-нибудь; }; шаблон класс MemoryBufferView { публика: использование this_container = MemoryBufferView; используя Layout_type = LayoutType; //Делай что-нибудь; }; Не компилируется, поскольку Clang не может найти тип MemoryDataLayout.
Но если я напишу это так:
template класс MemoryBufferView { публика: использование this_container = MemoryBufferView; используя Layout_type = LayoutType; //Делай что-нибудь; }; Компилятор по понятным причинам жалуется на использование Layout_type = LayoutType;
В идеале я знаю, что должен писать , используя Layout_type = LayoutType;, но кажется, что Type не виден из этого контекста.
Я знаю, что, наверное, можно было бы написать это так:
template класс MemoryBufferView { публика: использование this_container = MemoryBufferView; используя Layout_type = LayoutType; //Делай что-нибудь; }; Но это означало бы изменение большого количества кода во всей кодовой базе, поэтому, если бы я мог сохранить его «совместимым» только с одним аргументом шаблона, это было бы идеально... если это вообще возможно.
О, и мы ограничены C++17, к сожалению, ничего нового.
У меня пока нет идей, поэтому буду благодарен за любую помощь.
[ИЗМЕНИТЕ для получения более подробной информации]
Способ создания экземпляра этого класса в базе кода с макетом по умолчанию: MemoryBufferView m;
Единственное решение, которое я нашел, чтобы обеспечить совместимость большей части кодовой базы, это следующее:
template класс MemoryDataLayout { //Делай что-нибудь; }; template класс MemoryBufferView { публика: использование this_container = MemoryBufferView; используя Layout_type = LayoutType; //Делай что-нибудь; }; недействительный е () { MemoryBufferView м; } Но это работает только при вызове MemoryBufferView с макетом по умолчанию (в противном случае мне придется изменить вызовы).
Я мог бы с этим смириться, но ради любопытства, если есть что-нибудь получше, я был бы рад это прочитать

[ОКОНЧАТЕЛЬНОЕ РЕДАКТИРОВАНИЕ]
В итоге я воспользовался решением, предложенным выше, оно чище и точнее соответствует тому, что мы хотим.