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

 

Ошибка компиляции

class A { public:
        A *operator ++()      { return &this; }
};
template<typename T> void f( T t ) {}
void g( A *a )
{
        f( ++a ); //'A' - declaration without type (1)
        f( a.operator++()); //нормально            (2)
}
Особо отмечу - если поменять(!) местами строки (1) и (2) то все нормально, что требует дополнительной проверки
[Удален]  
A100:

Ошибка компиляции

Особо отмечу - если поменять(!) местами строки (1) и (2) то все нормально, что требует дополнительной проверки
Правильно ли понимаю, что f(++a) и f(a++) вызывают в Вашем примере разные варианты f?
 
Anton Zverev:
Правильно ли понимаю, что f(++a) и f(a++) вызывают в Вашем примере разные варианты f?

Нет, это ошибка компиляции - то есть до выполнения (конкретных вызовов) еще дело не дошло. Строки (1) и (2) эквивалентны с точки зрения кода (разная запись одного и того же)

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

class A { public:
        A *operator <<( int )      { return &this; }
};
template<typename T> void f( T* t ) {}
void g( A* a )
{
        f( a << 1 ); //'A' - declaration without type
}
[Удален]  
A100:

Строки (1) и (2) эквивалентны с точки зрения кода (разная запись одного и того же)

++a и a++ все же разные по смыслу. Не находите?
 
Anton Zverev:
++a и a++ все же разные по смыслу. Не находите?
там нет  a++
 

Ошибка компиляции: tree optimization error

#property library

class A { public:
template<typename T> int f( T a, int b, bool c = false );
};
template<typename T>
int A::f( T a, int b, bool c ) { return 0; }

class B : public A {
        virtual void g();
};
void B::g()
{
        f( 0, 0, false ); //нормально
        f( 0, 0 );        //tree optimization error
}

class C {};
void start( C* ) export {}

Поскольку 'tree optimization error' относится к разряду труднолокализуемых, просьба к разработчикам (если есть такая возможность) всю оптимизацию выносить в ключ оптимизации (благо он есть), иначе даже при отключенной оптимизации ранее рабочие программы после обновления build оказываются полностью неработоспособными (а назад вернуться нельзя).

Отмечу что все сегодняшние ошибки не старые, а новые - раньше то (build 1241) все работало
[Удален]  
A100:
там нет  a++

Верно. Поэтому конкретизировал

Anton Zverev:
Правильно ли понимаю, что f(++a) и f(a++) вызывают в Вашем примере разные варианты f?
 

Требуется доработка шаблонов (вынос реализации за class A {})

template<typename T>
class A { public:
template<typename T2>
        void f1( T2 t2 );
template<typename T2>
        void f2( T2 t2, T tt ) { Print( __FUNCSIG__, " ", typename( this.t ) ); }
template<typename T2>
        void f3( T2 t2, T tt );
        T t;
};
template<typename T>
template<typename T2>
void A::f1( T2 t2 )       { Print( __FUNCSIG__, " ", typename( this.t ) ); } //нормально
template<typename T>
template<typename T2>
void A::f3( T2 t2, T tt ) { Print( __FUNCSIG__, " ", typename( this.t ) ); } //error: 'T' - declaration without type

Не получается реализовать A::f3 вне class A {}.

Вы скажете - но внутри то class A {} - можно. Да, можно... например f2(), но неудобство заключается в том, что цель - вынести громозкие функции за class A {}. А главное то что A::f1() то можно вынести за class A {} и все работает, а  A::f3() - нельзя - компилятор генерирует ошибку, а, A::f1() от A::f3() принципиально ничем не отличаются.

 
Не, это жесть какая-то, кстати по идее typedef решит проблему
 
A100:

Требуется доработка шаблонов (вынос реализации за class A {})

Не получается реализовать A::f3 вне class A {}.

Вы скажете - но внутри то class A {} - можно. Да, можно... например f2(), но неудобство заключается в том, что цель - вынести громозкие функции за class A {}. А главное то что A::f1() то можно вынести за class A {} и все работает, а  A::f3() - нельзя - компилятор генерирует ошибку, а, A::f1() от A::f3() принципиально ничем не отличаются.

Вот так норм компилится.

template<typename T>
class A { public:
template<typename T2>
        void f1( T2 t2 );
template<typename T2,typename T>
        void f2( T2 t2, T tt ) { Print( __FUNCSIG__, " ", typename( this.t ) ); }
template<typename T2,typename T>
        void f3( T2 t2, T tt );
        T t;
};
template<typename T2>
void A::f1( T2 t2 )       { Print( __FUNCSIG__, " ", typename( this.t ) ); } //?????????
template<typename T2,typename T>
void A::f3( T2 t2, T tt ) { Print( __FUNCSIG__, " ", typename( this.t ) ); } //error: 'T' - declaration without type

 

 

А f1 и f3 у Вас немного отличались