Баг компилятора: cannot convert from const pointer to nonconst pointer - страница 2

 
A100:
Обсуждается конкретный код... конкретная ошибка, а не методы её обхода - я их и без Вас знаю и не один

Удивительно, как недопрограммер (то бишь я) пишет спокойно такие вещи на MQL5. Для Вас, видимо, нет разницы, куда const поставить.

 
fxsaber:

const T и T const - принципиальная разница.

Нет между ними никакой разницы.  Это просто различные варианты объявления константной переменной, принятые в C++:

const int a;
int const a;

Специально проверил в С++ (VS), если перегрузить шаблон такими вариантами, то выдаёт ошибку:  function template has already been defined


p.s. Впрочем данный баг действительно пустяковый, и совсем не относится к теме данной ветки.

 
Alexey Navoykov:

Нет между ними никакой разницы.  Это просто различные варианты объявления константной переменной, принятые в C++:

Ну классика же, что дает каждый const в этой строке

class A
{
public:
  template <typename T>
  const T* const f( const T* const Value ) const
  {
    return(Value);
  }
};

void OnStart()
{
  A a;
  
  a.f(&a);
};
 
fxsaber:

Ну классика же, что дает каждый const в этой строке

какая разница между

const T * const и 

T const * const?

 
fxsaber:

Ну классика же, что дает каждый const в этой строке

Не путайте понятия. Шаблон - это не define.  Когда в шаблон const T передаётся указатель a, то он развёртывается в T*const

p.s. Поправлюсь.  Он развёртывается либо в T*const, либо в сonst T*const, в зависимости от типа передаваемого указателя.   Т.е. const T для указателя никак не влияет на константность ссылаемого объекта.

p.p.s. Ещё раз поправлюсь. В первый раз я написал всё верно.  const T для указателя равносилен T*const, который в свою очередь принимает указатель на любой объект, хоть константный, хоть нет.
 
TheXpert:

какая разница между

const T * const и 

T const * const?

Наверное, в этом

class A {};

template <typename T>
void f( T& const ) {} // 'const' - unexpected token

void OnStart()
{
  A a;
  
  f(a);
};
 
fxsaber:

Наверное, в этом

const не может относиться к ссылке

 
Alexey Navoykov:
Не путайте понятия. Шаблон - это не define.  Когда в шаблон const T передаётся указатель a, то он развёртывается в T*const

Это не так

class A
{
public:
  int i;
};

template <typename T>
void f1( const T Value )
{
  Value = NULL;
  Print(__FUNCSIG__);
}

template <typename T>
void f2( T* const Value )
{
  Value.i = 0;
  Print(__FUNCSIG__);
}

void OnStart()
{
  A a;
  
  f1(&a); // void f1<A*>(const A*)
  f2(&a); // void f2<A>(A*const)
};
 
A100:

А что тогда остаётся? Здесь https://www.mql5.com/ru/forum/278274#comment_8625450 Вы согласны что это Ваша ошибка? (компилятор все сделал правильно)

Речь шла о том, что компилятор путает константный указатель с константным объектом, на который он ссылается. Т.е. фундаментальная ошибка.  И перестановкой const там дело не исправишь.  А в вашем случае просто такой вариант сигнатуры шаблона не поддерживается (когда const справа), как понял.
 
fxsaber:

Это не так

Я там уже дополнил свой пост.  Он может принимать указатель на любой объект, хоть на константный, хоть нет.  
Причина обращения: