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

 
fxsaber:

Почему оба варианта должны компилироваться?

Вообще я шаблоны использую редко - в детали не вдавался - могу объяснить только на интуитивном уровне

Во 2-ом случае прямая замена T на A* компилируется нормально - значит и шаблон должен компилироваться

class A {};
void f( A * const ) {}
void OnStart()
{
        A *a;
        f( a ); //нормально
}

В 1-ом случае прямая замена не работает, но можно добавить избыточный параметр T2 - с ним компилируется нормально - значит и без него должно - на то он и избыточный

template<typename T, typename T2>
void f( T, const T2 ) {}
class A {};
void OnStart()
{
        const A *a;
        f( a, a ); //нормально
}
 
A100:

Интуитивно, const иногда является частью типа, а иногда просто идентификатором, что внутри функции указатель будет const.

Это можно прочувствовать через Print(__FUNCSIG__);

 
Странно как-то выводится значение просадки в таблице оптимизации. Выводится максимальная просадка по средствам (но пишется в процентах). А после одиночного теста выясняется что относительная просадка отличается от максимальной (процент больше или меньше). При использовании мани-менеджмента придется дописывать что-то, чтобы выводились нужные результаты?
 
A100:

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

template<typename T>
void f( T, const T ) {}
class A {};
void OnStart()
{
        A * const a = new A;
        f( a, a ); //error: 'a' - cannot convert from const pointer to nonconst pointer
}
Так компилится, изначальный вариант и не должен.
 
Комбинатор:
Так компилится, изначальный вариант и не должен.

Почему?

template<typename T>
struct B {
        void f( T, const T ) {}
};
class A {};
void OnStart()
{
          const A* a;
        B<const A*> b;
        b.f( a, a ); //нормально
}

так то - все нормально. А что принципиально изменилось?

template<typename T>
        void f( T, const T ) {}
class A {};
void OnStart()
{
          const A *a;
          f( a, a ); //error: 'a' - cannot convert from const pointer to nonconst pointer
}
 
A100:

А что принципиально изменилось?

Разница огромная! Вот, что Вы вызвали

void B<const A*>::f(const A*,const A*)
Компилятор бажит в том смысле, что не может догадаться до нужного корректного варианта шаблона. Явно подсказал ему
template<typename T>
        void f( T, const T ) {}
class A {};
void OnStart()
{
          const A *a;
          f<const A*>( a, a );
}

И все заработало.

 
fxsaber:
 И все заработало.

 А зачем лишние символы?

 
A100:

 А зачем лишние символы?

Чтобы показать, что компилятор не догадывается до вполне рабочего варианта шаблона.

 
fxsaber:

Чтобы показать, что компилятор не догадывается до вполне рабочего варианта шаблона.

А зачем? СервисДеск сам в состоянии разобраться

 
A100:

Почему?

Судя по вашей специализации у типа должен отбрасываться const, что и делается. При явном указании нужного типа конечно же будет компилиться.
Причина обращения: