Баг компилятора - pointer to pointer is illegal

 

Наткнулся на такой досадный баг компилятора.  Билд 1961.

template<typename T>
class A {  };

class B {  };

template<typename T>
void F(A<T*>&) {  }  //'*' - pointer to pointer is illegal

void OnInit()
{ 
  A<B*> a;
  F(a);
}

Ломаю голову, как обойти этот баг.  Нужно чтобы из функции F можно было получить доступ к классу B.  Если объявить аргумент как A<T>, то мы получим тип указателя, а не класса. 

В общем виде задача состоит в том, чтобы развести A<T> и A<T*> по разным функциям, т.е. отдельно обрабатывать классы, отдельно указатели:

template<typename T>
void F(A<T*>&) {  }

template<typename T>
void F(A<T>&) {  }

Но в MQL не работает ни перегрузка шаблонов, ни даже просто сигнатура A<T*>.

 
Тестируете в Visual Basic?
 
Vladimir Karputov:
Тестируете в Visual Basic?
Не понял Вас.
 

Alexey Navoykov:

Нужно чтобы из функции F можно было получить доступ к классу B.

Классы инкапсулированы, то есть изначально не предназначены чтобы к ним был доступ извне.

И какой смысл мозги себе выворачивать на изнанку с этими классами? Ошибки потом в таком коде невозможно будет найти...

Не проще ли только с функциями работать?

 
Alexey Navoykov:
Не понял Вас.

Укажите Имя, Фамилию и Отчество терминала. Вы же на техническом форуме :)

Информацию брать: после перезагрузки терминала первые три строчки из окна "Инструменты" из вкладки "Журнал".

 
Vladimir Karputov:

Укажите Имя, Фамилию и Отчество терминала. Вы же на техническом форуме :)

Информацию брать: после перезагрузки терминала первые три строчки из окна "Инструменты" из вкладки "Журнал".

Если вы про номер билда, то 1961,  MQL5.  
 
Alexey Navoykov:
Если вы про номер билда, то 1961.   

Укажите все необходимые данные сразу в первом сообщении. Это ведь элементарное уважение: указать на чём тестируете.

 
template<typename T>
class A {  };

class B {  };

template<typename T>
void F(A<T>*) {  Print(__FUNCSIG__); }

void OnStart()
{ 
  A<B*> a;
  A<B>  b;
  
  F(&a);
  F(&b);
}


void F<B*>(A<B*>*)
void F<B>(A<B>*)
 
fxsaber:
Что вы хотели сказать вашим примером?  Задача была получить класс B.   Например чтобы можно было сделать  new T
 
Alexey Navoykov:
Задача была получить класс B.

ну так и получили же

 

В общем единственный работающий вариант пока такой:

template<typename T>
void __Temp(const T* ptr) { new T; }

template<typename T>
void __Temp(const T& obj) { new T; }

template<typename T>
void F(A<T>&)  { static T a; __Temp(a); }

Но недостаток в том, что если T = класс,  то в функции F создаётся объект с конструктором по умолчанию, а такого конструктора может не быть.

Причина обращения: