Forward declaration of explicit specialization
От: sga_coder  
Дата: 02.05.06 21:56
Оценка:
Столкнулся с непонятным поведением компилятора. Чтение стандарта не помогло. Может кто-то из гуру просветит?

Имеем приведенный ниже код. Компилятор (gcc) выдает ошибку в указанной сроке. Причина ошибки понятна — в этой точке мы имеем только декларацию (но не определение) S<double>. Если мы уберем строчку с a.f(), компилятор ошибку не выдает, хотя вызов S<double>::f() делается в функции foo(). Почему ошибка исчезает? Ведь в точке определения и в точке вызова foo нам еще не известно определение S<double>.

template <typename T>
struct S
{
};

template <> struct S<double>;

template <typename U>
void foo(S<U> const & t)
{
    t.f();
}

template <>
struct S <float>
{
    S(S<double> const & a)
    {
        a.f();   // invalid use of undefined type 'const struct S<double>'
        foo(a);
    }
};

template <>
struct S <double>
{
    void f() const {}
};

S<double> v;
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.