У меня есть следующие классыC++ 11 псевдонимов и шаблон шаблона
struct Abis
{
void foo() { // does something }
};
struct A
{
typedef Abis bis_type;
bis_type create() { // instanciates Abis object };
};
template<class Tbis> // typically Tbis would be Abis
struct Bbis
{
// something
};
template<class T> // typically T would be A
struct B
{
typedef Bbis<typename T::bis_type> bis_type;
bis_type create() { // instanciates Bbis object };
};
Теперь я хотел бы добавить еще один слой:
template<class Tbis, template<class> class Ubis>
struct Cbis : public Ubis<Tbis>
{
void additional_method() { // does something calling Tbis and Ubis methods}
};
и имеет класс С экземпляром объекта CBIS поэтому я может написать что-то вроде этого:
C<A,B> c();
Cbis<Abis,Bbis> cbis = c.create();
cbis.additional_method();
Это требует быть в состоянии обратиться к ЬурейеМу bis_types, так что я попробовал этот
template<class T, template<class> class U>
struct C
{
template<class S>
using Ubis_type = U<S>::bis_type // PROBLEM!
typedef Cbis<typename T::bis_type,Ubis_type> bis_type;
bis_type create();
}
Это не похоже на работу и ни делает
template<class T, template<class> class U>
struct C
{
template<class S>
using Ubis_type = typename U<S>::bis_type // PROBLEM!
typedef Cbis<typename T::bis_type,Ubis_type> bis_type;
bis_type create();
}
Как временное решение, я могу передать тип B в качестве параметра шаблона для CBIS, но это не очень уважаю дизайн и я хотел бы понять, в чем проблема.
Является ли мой синтаксис правильным? (Я использую XCode 7.3)
Благодарности
вы уже прочь к неправильному началу, даже прежде чем вы вышли из ворота: 'ЬурейеГо Bbis bis_type;' - «Bbis» - не тип. Это шаблон. Большая разница. Конечно, «U
» - «ПРОБЛЕМА!» В любом месте нет шаблона U. Все это выглядит как фэнтезийный код, а не настоящий код. –* «Это не работает, и не« * », включая сообщения об ошибках –
template // Это не имеет смысла, поскольку вы вообще не используете класс T ... –
nosbor