Ошибки, баги, вопросы - страница 1749

 
fxsaber:
Оформил тиковый индикатор в кодобазу. Но прикрепить исходники не получается - нажимаю "Прикрепить файлы", надпись исчезает, но интерфейса для выбора файлов не появляется. 
может адблок установлен? который блочит все всплывающие окна 
 
Vladislav Andruschenko:
может адблок установлен? который блочит все всплывающие окна 

Ничего не менял. Раньше все работало.

При оформлении нажимаю на эту кнопку

 

В ответ ничего, кроме этого

 

 
Sergei Vladimirov:
Да понял я ваш вопрос. Есть функция с более подходящей сигнатурой, но её нельзя вызывать, потому что она защищённая. Да, поведение отличается от студии: в МКЛ, получается, более жёсткий контроль типов (в данном случае). Не знаю, стоит ли это считать ошибкой. Если контролировать тип передаваемого в функцию аргумента, то проблемы не будет.

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

class A {
public:
        void f( int ) const {} /*(1)*/        
        void f( int )       {} /*(2)*/
};
class B : public A {
public:
        void f( int ) const {} /*(3)*/
};
void OnStart()
{
        B b; //не const B
        b.f( 0 ); //(*)

}
Здесь в (*) по совокупности (с учетом не const B b ) больше подходит вызов A::f/*(2)*/

Но С++ всегда не анализирует базовый класс на более подходящий метод, если в производном есть просто подходящий.

А MQL - в предыдущем примере анализировал базовый класс на более подходящий метод, а в этом - не анализирует (здесь также как и С++ вызовет B::f/*(3)*/), а значит - нет единого подхода

Еще пример противоречивого контроля: C++ находит следующий код

class A { public:
        void f(  int i ) const {}
        void f( uint i )       {}
};
void OnStart()
{
        A a;
        a.f((int)0 );
}
ошибочным, а MQL - добротным
 
A100:

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

class A {
public:
        void f( int ) const {} /*(1)*/        
        void f( int )       {} /*(2)*/
};
class B : public A {
public:
        void f( int ) const {} /*(3)*/
};
void OnStart()
{
        B b; //не const B
        b.f( 0 ); //(*)

}
Здесь в (*) по совокупности (с учетом не const B b ) больше подходит вызов A::f/*(2)*/

Но С++ всегда не анализирует базовый класс на более подходящий метод, если в производном есть просто подходящий.

А MQL - в предыдущем примере анализировал базовый класс на более подходящий метод, а в этом - не анализирует (здесь также как и С++ вызовет B::f/*(3)*/), а значит - нет единого подхода

Еще пример противоречивого контроля: C++ находит следующий код

class A { public:
        void f(  int i ) const {}
        void f( uint i )       {}
};
void OnStart()
{
        A a;
        a.f((int)0 );
}
ошибочным, а MQL - добротным
у вас компилятор под C++ какой? у меня gcc и все проходит без ошибок
 
coderex:
у вас компилятор под C++ какой? у меня gcc и все проходит без ошибок
И какую же функцию gcc вызывает в итоге? 
class A { public:
        void f(          int i ) const {} //1
        void f( unsigned int i )       {} //2
};
void OnStart()
{
        A a;
        a.f((int)0 );
}

(1) или (2). Сейчас вставлю сообщение компилятора

 

Вот это действительно - строгий контроль: один метод больше подходит по сигнатуре, другой - по константности

 
A100:

Вот это действительно - строгий контроль: один метод больше подходит по сигнатуре, другой - по константности

Ну если сделать const A a;, то (1) должен вызываться. Если нет - то на усмотрение компилятора. Т.е. однозначности быть не может. И не ясно, зачем такое писать.
 
fxsaber:
 И не ясно, зачем такое писать.

Замените f -> operator[], возьмите свой недавний пример - подумайте как сделать [] и слева и справа. Добавьте константности по вкусу - далее заверните в шаблон и у Вас получится нечто похожее

Если сделать const - рассматривается вариант без если

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

 
A100:
Замените f -> operator[], возьмите свой недавний пример - подумайте как сделать [] и слева и справа. Добавьте константности по вкусу - далее заверните в шаблон и у Вас получится нечто похожее
О каком примере речь? Могли бы Вы привести не исходник, а конечную запись, которая должна работать?
 
fxsaber:
О каком примере речь? Могли бы Вы привести не исходник, а конечную запись, которая должна работать?

В итоге должно получиться что то вроде этого

void OnStart()
{
        A<int> a;
        int b  = a[ 0 ];
        a[ 0 ] = a[ 1 ];
        a[ 1 ] = b;
}
 
A100:

В итоге должно получиться что то вроде этого

void OnStart()
{
        A<int> a;
        int b  = a[ 0 ];
        a[ 0 ] = a[ 1 ];
        a[ 1 ] = b;
}
Индексы константные?
Причина обращения: