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) то все нормально, что требует дополнительной проверки
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
}
#property libraryclass 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 ) { return0; }
class B : public A {
virtualvoid 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)все работало
Вы скажете - но внутри то class A {} - можно. Да, можно... например f2(), но неудобство заключается в том, что цель - вынести громозкие функции за class A {}. А главное то что A::f1() то можно вынести за class A {} и все работает, а A::f3() - нельзя - компилятор генерирует ошибку, а, A::f1() от A::f3() принципиально ничем не отличаются.
Требуется доработка шаблонов (вынос реализации за class A {})
Не получается реализовать A::f3 вне class A {}.
Вы скажете - но внутри то class A {} - можно. Да, можно... например f2(), но неудобство заключается в том, что цель - вынести громозкие функции за class A {}. А главное то что A::f1() то можно вынести за class A {} и все работает, а A::f3() - нельзя - компилятор генерирует ошибку, а, A::f1() от A::f3() принципиально ничем не отличаются.
Ошибка компиляции
Особо отмечу - если поменять(!) местами строки (1) и (2) то все нормально, что требует дополнительной проверкиОшибка компиляции
Особо отмечу - если поменять(!) местами строки (1) и (2) то все нормально, что требует дополнительной проверкиПравильно ли понимаю, что f(++a) и f(a++) вызывают в Вашем примере разные варианты f?
Нет, это ошибка компиляции - то есть до выполнения (конкретных вызовов) еще дело не дошло. Строки (1) и (2) эквивалентны с точки зрения кода (разная запись одного и того же)
Еще приведу пример чтобы не сложилось впечатление что дело исключительно в операторе ++
Строки (1) и (2) эквивалентны с точки зрения кода (разная запись одного и того же)
++a и a++ все же разные по смыслу. Не находите?
Ошибка компиляции: tree optimization error
Поскольку 'tree optimization error' относится к разряду труднолокализуемых, просьба к разработчикам (если есть такая возможность) всю оптимизацию выносить в ключ оптимизации (благо он есть), иначе даже при отключенной оптимизации ранее рабочие программы после обновления build оказываются полностью неработоспособными (а назад вернуться нельзя).
Отмечу что все сегодняшние ошибки не старые, а новые - раньше то (build 1241) все работалотам нет a++
Верно. Поэтому конкретизировал
Правильно ли понимаю, что f(++a) и f(a++) вызывают в Вашем примере разные варианты f?
Требуется доработка шаблонов (вынос реализации за class A {})
Не получается реализовать A::f3 вне class A {}.
Вы скажете - но внутри то class A {} - можно. Да, можно... например f2(), но неудобство заключается в том, что цель - вынести громозкие функции за class A {}. А главное то что A::f1() то можно вынести за class A {} и все работает, а A::f3() - нельзя - компилятор генерирует ошибку, а, A::f1() от A::f3() принципиально ничем не отличаются.
Требуется доработка шаблонов (вынос реализации за class A {})
Не получается реализовать A::f3 вне class A {}.
Вы скажете - но внутри то class A {} - можно. Да, можно... например f2(), но неудобство заключается в том, что цель - вынести громозкие функции за class A {}. А главное то что A::f1() то можно вынести за class A {} и все работает, а A::f3() - нельзя - компилятор генерирует ошибку, а, A::f1() от A::f3() принципиально ничем не отличаются.
Вот так норм компилится.
А f1 и f3 у Вас немного отличались