Баг компилятора: undefined struct cannot be used

 
template<typename T>
struct A;

void f(A<int>& a) {  }  // undefined struct 'A' cannot be used

template<typename T>
struct A
{
};

В старых билдах работало нормально.

 

Да, это уже fxsaber отметил.

Но, с другой стороны - они правы, как можно использовать структуру ДО ее объявления ?

 

Да, я поспешил в выводами. Действительно структуру нельзя использовать.  Просто в таком виде оно успешно компилируется в С++. Но при попытке обратиться к какому-либо члену структуры выдаётся ошибка.

Тему можно удалить. 

 
В чем принципиальное отличие исходного варианта от этого?
struct A;

void f(A& a) {}

struct A
{
};
 
А этот код ошибок не вызывает
template <typename T>
bool f();

bool b = f<int>();

template <typename T>
bool f() { return(true); }

но при этом уводит компилятор в бесконечный цикл.

 
fxsaber:
В чем принципиальное отличие исходного варианта от этого?

В C++ отличий нет, оба варианта не компилируются при попытке обращения к объекту.  А здесь иначе, что и ввело меня в заблуждение.

 
fxsaber:
А этот код ошибок не вызывает

но при этом уводит компилятор в бесконечный цикл.

В С++ это работает нормально.

 
Alexey Navoykov:

В С++ это работает нормально.

Почему и для C++ вариант для структуры и для функции отличается? И там и там предварительное задание присутствует.

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Баг компилятора: undefined struct cannot be used

Alexey Navoykov, 2018.11.09 11:26

В C++ отличий нет, оба варианта не компилируются при попытке обращения к объекту.  А здесь иначе, что и ввело меня в заблуждение.

Т.е. это более глубокий анализ кода?
 

Что-то вы поздно спохватились. Эта проблема всплыла уже давно:

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Ошибки, баги, вопросы

Stanislav Korotky, 2018.07.28 22:29

Отвлекся на годик от своей реализации STLMQL и теперь это чудо не компилируется. Был такой код (упрощен до минимального для воспроизведения ошибки):

template<typename T> class IterableContainer;

class STL
{

    template<typename T, typename UP>
    bool all_of(IterableContainer<T> &c, UP p) const // ошибка
    {
      return true; // all_of(c.begin(), c.end(), p);
    }
};

template<typename T>
class IterableContainer
{
};

Теперь форвард декларация не компилируется - выдается ошибка undefined class 'IterableContainer' can not be used. Без форвард деклараций я там не обойдусь. Не соображу, как поправить.


MQ обещали починить, но в связи с "кончиной" сервис-деска исход неизвестен.

 
Stanislav Korotky:

Что-то вы поздно спохватились. Эта проблема всплыла уже давно:


MQ обещали починить, но в связи с "кончиной" сервис-деска исход неизвестен.

Проверил ваш код на текущем билде - всё компилируется.
 
Alexey Navoykov:
Проверил ваш код на текущем билде - всё компилируется.

Значит есть разница в обработке шаблонизированных классов/структур.