Доброго времени суток!
Объясните мне, pls, с точки зрения стандарта, почему следующий код не компилируется?
struct X
{
template<typename T, typename TT>
void RR(T t)
{
static_cast<TT*>(this)->R(t);
}
};
struct a { void R(int) {} };
struct b { void R(float) {} };
struct d : X, a, b
{
void foo()
{
RR<int,a>(2);
RR<float,b>(2.0f);
}
};
int main() { d().foo(); }
Сomeau выдает следующее:
Comeau C/C++ 4.3.1 (Mar 1 2003 20:09:34) for ONLINE_EVALUATION_BETA1
Copyright 1988-2003 Comeau Computing. All rights reserved.
MODE:strict errors C++
"ComeauTest.c", line 6: error: invalid type conversion
static_cast<TT*>(this)->R(t);
^
detected during instantiation of
"void X::RR<T,TT>(T) [with T=int, TT=a]" at line 24
"ComeauTest.c", line 6: error: invalid type conversion
static_cast<TT*>(this)->R(t);
^
detected during instantiation of
"void X::RR<T,TT>(T) [with T=float, TT=b]" at line 25
2 errors detected in the compilation of "ComeauTest.c".
Что говорит VC 7 писать не буду
Ошибку я обошел, введя третий параметр template:
struct d : X, a, b
{
void foo()
{
RR<int,a,d>(2);
RR<float,b,d>(2.0f);
}
};
Но мне не понятно, почему же в первом случае компилятор не смог найти функцию, например, static_cast<a*>(d*)->R(int) ?
Может я чего-то сильно не понимаю?
Здравствуйте, Dmitriev Sergey Victorovich, Вы писали:
DSV> Доброго времени суток! DSV> Объясните мне, pls, с точки зрения стандарта, почему следующий код DSV> не компилируется?
DSV>
Давай самостоятельно "проинстанциируем" шаблон, скажем, для случая RR<int,a>(2):
struct X
{
void RR_int_a(int t)
{
static_cast<a*>(this)->R(t);
}
};
Таким образом, специализация RR<int, a> пробует привести указатель X* к типу a*,
используя для этого static_cast. Т.к. типы X и a между собой никак не связаны,
естественно, это не разрешено.
Posted via RSDN NNTP Server 1.5 beta
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Здравствуйте, Dmitriev Sergey Victorovich, Вы писали:
DSV>Доброго времени суток! DSV>Объясните мне, pls, с точки зрения стандарта, почему следующий код не компилируется?
DSV>[ccode] DSV>struct X DSV>{ DSV> template<typename T, typename TT> DSV> void RR(T t) DSV> { DSV> reinterpret_cast<TT*>(this)->R(t); DSV> } DSV>};
Здравствуйте, Павел Кузнецов, Вы писали:
ПК>Таким образом, специализация RR<int, a> пробует привести указатель X* к типу a*, ПК>используя для этого static_cast. Т.к. типы X и a между собой никак не связаны, ПК>естественно, это не разрешено.
Я прошу прощения за неверно приведенный пример. Писал после бессонной ночи и прошу сильно ногами не пинать. В таком варианте вопрос превратился в нелепость.
На самом деле имелся ввиду следуюший пример:
struct X
{
template<typename T, typename TT>
void RR(T t)
{
static_cast<TT*>(this)->R(t);
}
};
struct a { void R(int) {} };
struct b { void R(float) {} };
struct d : X, a, b
{
void foo()
{
RR<int,d>(2);
RR<float,d>(2.0f);
}
};
int main()
{
d().foo();
}
Cameau ругнулся следующим образом.
Comeau C/C++ 4.3.1 (Mar 1 2003 20:09:34) for ONLINE_EVALUATION_BETA1
Copyright 1988-2003 Comeau Computing. All rights reserved.
MODE:strict errors C++
"ComeauTest.c", line 6: error: "d::R" is ambiguous
static_cast<TT*>(this)->R(t);
^
detected during instantiation of
"void X::RR<T,TT>(T) [with T=int, TT=d]" at line 18
"ComeauTest.c", line 6: error: "d::R" is ambiguous
static_cast<TT*>(this)->R(t);
^
detected during instantiation of
"void X::RR<T,TT>(T) [with T=float, TT=d]" at line 19
2 errors detected in the compilation of "ComeauTest.c".
Вот что я хотел спросить. Собственно откуда берется "ambiguous", если перегрузка функций должна однозначно указать на конкретную функцию? Вот еще более непонятный пример:
struct X
{
template<typename T, typename TT>
void RR(T t)
{
static_cast<TT*>(this)->R(t);
}
};
struct a { void R(int) {} };
struct b { typedef double R; };
struct d : X, a, b
{
void foo()
{
RR<int,d>(2);
}
};
int main()
{
d().foo();
}
"Ответ" Cameau :
Comeau C/C++ 4.3.1 (Mar 1 2003 20:09:34) for ONLINE_EVALUATION_BETA1
Copyright 1988-2003 Comeau Computing. All rights reserved.
MODE:strict errors C++
"ComeauTest.c", line 6: error: "d::R" is ambiguous
static_cast<TT*>(this)->R(t);
^
detected during instantiation of
"void X::RR<T,TT>(T) [with T=int, TT=d]" at line 18
1 error detected in the compilation of "ComeauTest.c".
Здравствуйте, Bell.
Спасибо за ответ, но я, к сожалению, спросил не то, что хотел узнать . Прошу извинить. Настоящий вопрос находиться в моем ответе Павлу Кузнецову.
Ты постоянно меняешь условия. R у тебя в одном из классов — typedef'ом был. Но это не важно. То, что ты в вопросе (исправленном) не эквивалентно тому что написано выше. До сигнатуры тут дело не доходит. Смотри clause 10 стандарта (там, по-моему)
Of course, the code must be complete enough to compile and link.