Проблема с template классами с 2470 билда

 

со вчерашней обновы на 2470 перестало компилироваться


class Class
{
public:
        virtual void f() { };
};

template<typename T>
class Template : public T
{
public:
        virtual void f() { T::f(); }; <-- новый компилятор не видит функцию f переданого класса
};

Template<Class>* c=new Template<Class>();


'f' - undeclared identifier     


кто знает что делать как пофиксить?

 
trufather:

со вчерашней обновы на 2470 перестало компилироваться



кто знает что делать как пофиксить?

Думал у меня половина кода на этой логике... аннн нет все компилируеться. 

В вашем же случае остается только преобразовывать класс

 
trufather:

со вчерашней обновы на 2470 перестало компилироваться 
кто знает что делать как пофиксить?

О подобного рода проблеме неоднократно сообщалось ранее:
MT5(build 2390)) **  (up)        Compile Error, баг при попытке доступа к internal class для шаблонного параметра шаблонной функции.


Возможное обходное решение:

template<typename T>
struct GetTypeClass{
   class type : public T{};
};

class Class{
public:
   virtual void f(){
      printf("1"); 
   };
};

template<typename T>
class Template : public T{
public:
   virtual void f(){ 
      GetTypeClass<T>::type::f(); 
      printf("2");
   };
};

Template<Class>* c=new Template<Class>();

void OnStart(){
   c.f();          // 1 2
   delete c;
}
 
void OnStart()
  {
   hhc.f();
  }
//+------------------------------------------------------------------+
class Class
  {
public:
   void              f() {Print("wow"); };
  };


template<typename T>
class Template : public T
  {
public:
   //void              f() { T::f(); } //<-- новый компилятор не видит функцию f переданого класса
   void              f() { ((T)(this)).f(); }; //работает приведение класса
  };

Template<Class>* hhc=new Template<Class>();
 
Alexandr Andreev:
f() { ((T)(this)).f(); };

очень читаемо :-) ещё чуть и оператор (_|_) станет общей практикой

Так скоро MQL начнёт напоминать худшее из плюсов :-)

PS/ кстати: рад видеть, слышать !

 
Maxim Kuznetsov:

очень читаемо :-) ещё чуть и оператор (_|_) станет общей практикой

Так скоро MQL начнёт напоминать худшее из плюсов :-)

PS/ кстати: рад видеть, слышать !

Взаимно! 

Тут кстати оператор "равно" перестал наследоваться через класс. С другими операторами все ок.... Не в курсе чего это так?

 
Maxim Kuznetsov:

очень читаемо :-) ещё чуть и оператор (_|_) станет общей практикой

не получится, видимо главная комиссия по стандартам языка С++ учла этот момент заранее

бинарная операция ИЛИ требует операнд слева и справа, а знак подчеркивания запрещен синтаксисом языка как самостоятельное имя идентификатора

но выход есть! Ж. с ручками:

int _o = 1, o = 0, o_ = 1;
o =  (o_|_o);
 
Igor Makanu:

не получится, видимо главная комиссия по стандартам языка С++ учла этот момент заранее

бинарная операция ИЛИ требует операнд слева и справа, а знак подчеркивания запрещен синтаксисом языка как самостоятельное имя идентификатора

но выход есть! Ж. с ручками:

Дефайны в помощь

 
Igor Makanu:

не получится, видимо главная комиссия по стандартам языка С++ учла этот момент заранее

бинарная операция ИЛИ требует операнд слева и справа, а знак подчеркивания запрещен синтаксисом языка как самостоятельное имя идентификатора

но выход есть! Ж. с ручками:

лень эксперементировать, но наверное можно задефайнить..

#define _ foo

int _ () {

static int i=5;

return (i--)>2;

}

int main() {

...

if (_|_) {

}

..

}

 

хм... прям критическая секция исполнения получилась

if(_|_) 
{
...
}
 
Igor Makanu:

хм... прям критическая секция исполнения получилась

Юмористы :)))).
Причина обращения: