Xcode: ошибка: ожидается '(' для приведения или построения типа в стиле функций

У меня есть эта ошибка при попытке скомпилировать следующий код с помощью xcode. Он без проблем компилируется Visual Studio в Windows.

template <typename OutT, typename MayaArrayT>
void DumpMayaArray(std::vector<OutT>& out, const MayaArrayT& source)
{
    using MayaElementT = decltype(MayaArrayT()[unsigned int()]); // error happens in this line!
    static_assert(std::is_same<MayaElementT, OutT&>::value, "array type mismatch");

Предполагается, что этот фрагмент кода должен получить тип элемента MayaArrayT из возвращаемого типа ::operator[]( unsigned int index ); К сожалению, нет другого способа получить тип элемента MayaArrayT.


person Dmitrii Motorygin    schedule 22.04.2020    source источник


Ответы (1)


Код в decltype на самом деле является вызовом MayaArrayT::operator(unsigned int). Однако аргументы decltype на самом деле не оцениваются, поэтому вам нужно притвориться, что вы выполняете вызов, например:

using MayaElementT = decltype(
        std::declval<MayaArrayT&>()[std::declval<unsigned int>()]
      ); 
person cigien    schedule 22.04.2020
comment
Это верно, хотя я не могу понять, почему это была синтаксическая ошибка? - person Asteroids With Wings; 22.04.2020
comment
Тоже не слишком уверен. Хороший вопрос. - person cigien; 22.04.2020
comment
Ошибки clang и gcc немного сбивают с толку, хотя обе указывают на unsigned int и говорят, что ожидают какой-то тип. Не очень полезно. - person cigien; 22.04.2020
comment
Интересно. Я подозреваю, что это небольшая утечка абстракции в диагностике. - person Asteroids With Wings; 22.04.2020
comment
Да, это кажется разумным предположением. - person cigien; 22.04.2020
comment
Второй фрагмент кода не компилируется в Visual Studio. Первый работает. Спасибо! - person Dmitrii Motorygin; 22.04.2020
comment
Хм, странно. VS скомпилировал код в вашем вопросе? Я не уверен, почему на самом деле. - person cigien; 22.04.2020
comment
Однако я уверен, что проблема в том, что использование MayaElementT = decltype(MayaArrayT::operator[]); похоже, не работает... Это работает на вашей машине? - person Dmitrii Motorygin; 22.04.2020
comment
VS не скомпилировал его да, и он скомпилировал код в вопросе. - person Dmitrii Motorygin; 22.04.2020
comment
@cigen хорошо. Что-то должно быть не так с типами Maya, которые используют... Но в любом случае это не имеет отношения к данному вопросу. Спасибо за помощь! - person Dmitrii Motorygin; 22.04.2020
comment
Без проблем. Надеюсь, вы разберетесь с проблемой. - person cigien; 22.04.2020
comment
На самом деле я не уверен, что decltype(MayaArrayT::operator[]) правильный, поэтому я удалил это из ответа. - person cigien; 23.04.2020