namespace My
{
template<typename T> struct A;
template<typename T> struct B;
template<> struct A<bool>{ /* ... */ };
template<> struct B<bool>{ /* ... */ };
template<typename T> struct A
{
B<bool> func() { return B<bool>(); }
};
template<typename T> struct B
{
A<bool> func() { return A<bool>(); }
};
}
int main()
{
My::A<int> a;
a.func();
return 0;
}
Проблема с шаблонами при компиляции
Есть такой код в котором все ОК
Код:
namespace My
{
template<typename T> struct A sealed; \\объявляем что класс A<T> существует
template<typename T> struct B sealed; \\объявляем что класс B<T> существует
template<typename T> struct A sealed
{
B<T> func() { return B<T>(); }
};
template<typename T> struct B sealed
{
A<T> func() { return A<T>(); }
};
}
int _tmain(int argc, _TCHAR* argv[])
{
My::A<int> a;
a.func();
return 0;
}
{
template<typename T> struct A sealed; \\объявляем что класс A<T> существует
template<typename T> struct B sealed; \\объявляем что класс B<T> существует
template<typename T> struct A sealed
{
B<T> func() { return B<T>(); }
};
template<typename T> struct B sealed
{
A<T> func() { return A<T>(); }
};
}
int _tmain(int argc, _TCHAR* argv[])
{
My::A<int> a;
a.func();
return 0;
}
А вот такой код уже выдает ошибку: use of undefined type 'My::B<T>'
Код:
namespace My
{
template<typename T> struct A sealed;
template<typename T> struct B sealed;
template<typename T> struct A sealed
{
B<bool> func() { return B<bool>(); }
};
template<typename T> struct B sealed
{
A<bool> func() { return A<bool>(); }
};
}
int _tmain(int argc, _TCHAR* argv[])
{
My::A<int> a;
a.func();
return 0;
}
{
template<typename T> struct A sealed;
template<typename T> struct B sealed;
template<typename T> struct A sealed
{
B<bool> func() { return B<bool>(); }
};
template<typename T> struct B sealed
{
A<bool> func() { return A<bool>(); }
};
}
int _tmain(int argc, _TCHAR* argv[])
{
My::A<int> a;
a.func();
return 0;
}
Т.е. просто напросто компилятор еще не знает о существовании класса B<bool>
В принципе конечно можно вынести реализацию методов после инициализации обоих шаблонов, но не хотелось бы из эстетических соображений.
Что можете посоветовать?
Не могу найти отличий в приведённых кодах. В чём оно?
да, и я различий не вижу! мне кажется или вы по ошибки запостили один код дважды? ;)
Исправил.
Подозреваю, что придётся делать частичную специализацию шаблона. Как-то так:
Цитата: Kogrom
Подозреваю, что придётся делать частичную специализацию шаблона. Как-то так:
Пишу на другом диалекте, но, вероятно, тут это не важно.
Пишу на другом диалекте, но, вероятно, тут это не важно.
Да нет все как раз понятно....
Просто специализацию можно только 1 задать, а мне понадобяться как минимум 4: char, wchar_t, bool, int
Так что тема все еще актуальна
Цитата: sigmov
Просто специализацию можно только 1 задать, а мне понадобяться как минимум 4: char, wchar_t, bool, int
Возможно, подойдёт что-то типа:
Код:
namespace My
{
template<typename T> struct A;
template<typename T> struct B;
template<typename T> struct A
{
template<typename T2>
B<T2> func() { return B<T2>(); }
};
template<typename T> struct B
{
template<typename T2>
A<T2> func() { return A<T2>(); }
};
}
int main()
{
My::A<int> a;
a.func<bool>();
return 0;
}
{
template<typename T> struct A;
template<typename T> struct B;
template<typename T> struct A
{
template<typename T2>
B<T2> func() { return B<T2>(); }
};
template<typename T> struct B
{
template<typename T2>
A<T2> func() { return A<T2>(); }
};
}
int main()
{
My::A<int> a;
a.func<bool>();
return 0;
}
Для лучшего решения надо знать, что ты делаешь.