Здравствуйте, niXman, Вы писали:
X>все, на этом мои мысли закончились настолько, что никак не могу понять, каким в этом случае должно быть это выражение?: X>
Здравствуйте, niXman, Вы писали:
NB>>давай ты на псевдокоде изобразишь, что хочешь получить, а мы подумаем, как это реализовать. X>чтоб быть очень кратким — вот пример, который я пытаюсь заставить работать: X>
Здравствуйте, niXman, Вы писали:
X>вот тут, к примеру, имеет значение порядок записи параметров T и U ?
[...] X>если имеет — то какое правило? о чего зависит?
Да, имеет — нужно в порядке от внешнего шаблона, к внутреннему:
14.5.2 Member templates
1. A template can be declared within a class or class template; such a template is called a member template. A member template can be defined within or outside its class definition or class template definition. A member template of a class template that is defined outside of its class template definition shall be specified with the template-parameters of the class template followed by the template-parameters of the member template.
[ Example:
X>main.cpp:159:1: error: prototype for 'type<T>::type()' does not match any in class 'type<T>'
X> type<T>::type()
X>main.cpp:141:2: error: candidate is: type<T>::type()
X> type();
X>main.cpp:159:1: error: prototype for 'type<T>::type()' does not match any in class 'type<T>'
X> type<T>::type()
X>main.cpp:141:2: error: candidate is: type<T>::type()
X> type();
X>ЧЯДНТ?
type<T>::type нешаблонный метод шаблонного класса, ему не нужно два раза template указывать:
template<typename T>
type<T>::type()
:pimpl(new type<T>::impl<???>) // тут нужен какой-нибудь тип
{}
Здравствуйте, Abyx, Вы писали:
A>Здравствуйте, niXman, Вы писали:
A>если у тебя всегда impl<T>, то зачем вообще тебе делать impl шаблоном?
я это понимаю.
impl берет часть параметров от type, и часть своих.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
template<typename T>
struct type {
template<typename>
struct impl;
type(); // <<<<<<<<<<<<<<<<<<<<<<<<< 141
~type();
void m();
private:
impl<T> *pimpl;
};
template<typename T>
template<typename A>
struct type<T>::impl {
T t;
A a;
};
template<typename T>
template<typename A>
type<T>::type() // <<<<<<<<<<<<<<<<<<<<<<< 159
:pimpl(new type<T>::impl<A>)
{}
и получаю такую ошибку:
main.cpp:159:1: error: prototype for 'type<T>::type()' does not match any in class 'type<T>'
type<T>::type()
main.cpp:141:2: error: candidate is: type<T>::type()
type();
ЧЯДНТ?
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
вот тут, к примеру, имеет значение порядок записи параметров T и U ? EP>template<typename T> EP>template<typename U> EP>struct Foo<T>::impl EP>{ EP> U x; EP> T y; EP>};
если имеет — то какое правило? о чего зависит?
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Здравствуйте, Evgeny.Panasyuk, Вы писали:
EP>Да, имеет — нужно в порядке от внешнего шаблона, к внутреннему: EP>
EP>14.5.2 Member templates
EP>1. A template can be declared within a class or class template; such a template is called a member template. A member template can be defined within or outside its class definition or class template definition. A member template of a class template that is defined outside of its class template definition shall be specified with the template-parameters of the class template followed by the template-parameters of the member template.
EP>[ Example:
EP>
Здравствуйте, Evgeny.Panasyuk, Вы писали:
EP>template<typename T> EP>type<T>::type() EP> :pimpl(new type<T>::impl<T>) EP>{}
но тут и type и impl специализируются одним параметром, но такое не подходит. impl`у нужна возможность принимать другие параметры, не только T
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Здравствуйте, niXman, Вы писали:
EP>>template<typename T> EP>>type<T>::type() EP>> :pimpl(new type<T>::impl<T>) EP>>{} X>но тут и type и impl специализируются одним параметром, но такое не подходит. impl`у нужна возможность принимать другие параметры, не только T
Укажи тот параметр, который нужен (это не обязательно T), и будет совместим с:
template<typename T>
struct type {
// ...
impl<T> *pimpl;
};
Здравствуйте, niXman, Вы писали:
EP>>template<typename T> EP>>type<T>::type() EP>> :pimpl(new type<T>::impl<T>) EP>>{} X>но тут и type и impl специализируются одним параметром, но такое не подходит. impl`у нужна возможность принимать другие параметры, не только T
передавай нужный тип шаблонным параметром конструктора, или заводи отдельный метод:
Здравствуйте, Evgeny.Panasyuk, Вы писали:
EP>Укажи тот параметр, который нужен (это не обязательно T), и будет совместим с:
так я это и пытался сделать, тут:
template<typename T>
template<typename A>
type<T>::impl<A>::impl()
{}
т.е. тут T для type, и A для impl
EP>В type у тебя фиксированный набор impl<?>.
да, не вариадик.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Здравствуйте, night beast, Вы писали:
NB>передавай нужный тип шаблонным параметром конструктора, или заводи отдельный метод:
мне не конструктор impl`а нужно параметризовать, а весь impl.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Здравствуйте, niXman, Вы писали:
NB>>передавай нужный тип шаблонным параметром конструктора, или заводи отдельный метод: X>мне не конструктор impl`а нужно параметризовать, а весь impl.
давай ты на псевдокоде изобразишь, что хочешь получить, а мы подумаем, как это реализовать.
Re[10]: шаблон в шаблоне, и реализация вне шаблона
Здравствуйте, night beast, Вы писали:
NB>давай ты на псевдокоде изобразишь, что хочешь получить, а мы подумаем, как это реализовать.
чтоб быть очень кратким — вот пример, который я пытаюсь заставить работать:
Здравствуйте, night beast, Вы писали:
NB>вопрос на 5 баллов: что должно храниться в t.pimpl?
данные и приватные реализации, доступ к которым предоставляется посредством публичных методов type.
X>>ощущение такое, будто декларация и реализация конструктора type — разные.
NB>дык они и есть разные. NB>представь, что это не конструктор, а обычная функция. то что ты записал эквивалентно этому: NB>
NB>struct type {
NB> void foo ();
NB>};
NB>template< typename A >
NB>void type::foo ( ); // естественно этого мембера нету.
NB>
вот теперь я понял!
спасибо огромное, вопрос закрыт.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[13]: шаблон в шаблоне, и реализация вне шаблона