Тип псевдонима неполного шаблона шаблонаC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Тип псевдонима неполного шаблона шаблона

Сообщение Anonymous »


Я боролся с этим уже пару дней. Я портирую некоторый код на 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 с макетом по умолчанию (в противном случае мне придется изменить вызовы).

Я мог бы с этим смириться, но ради любопытства, если есть что-нибудь получше, я был бы рад это прочитать :)

[ОКОНЧАТЕЛЬНОЕ РЕДАКТИРОВАНИЕ]

В итоге я воспользовался решением, предложенным выше, оно чище и точнее соответствует тому, что мы хотим.
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»