Здравствуйте, w40, Вы писали:
B>>B>>VC6 is not up to C++ standards.
w40>о как! сделать что ли библиотеку на 2005.. и прикомпилять к основному проекту...
VC6 — это вообще притча во языцех. То, что ты пытаешься сделать (вложенные шаблоны, шаблоны методов) лучше вообще обходить стороной, если работаешь с VC6. Я бы посоветовал тебе взять более новую версию, хотя бы VC2005. А ещё лучше — VC2008 или VC2010 — там и среда получше, и компилятор, и генерируемый код.
Чтобы не быть голословным, советую тебе сходить в поиск по этому форуму по ключевому слову: "VC6".
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
спасибо! жаль, что в vc6 не работает.
большое всем спасибо за участие!
Для 2005 идр. — я разобрался, но это не считается
спасибо! жаль, что в vc6 не работает.

А надо бы. Очень.
но это ужЕ другая история...
во-1ых, виноват, но оказалось, что мой пример не соответствует....
во-2ых, в функции понадобился аргумент как раз типа (как раньше "AC"),
и одна проблема пропала, но появилась др.ошибка.
и опять же только в vc6.
error C2670: '_process_packetT' : the template function cannot convert parameter 2 from type 'struct CPkt4'
сообщение в стандартном виде должно выглядеть как:
'function' : cannot convert parameter number from 'type1' to 'type2'
но как видно из сообщения — в нём недостает "to `type`"
т.е. компилятор воще не сумел понять 2го типа в функции.
подскажите пожалуйста, как с этим бороться ? (в vc6!!!)
а вот и соответствующий пример:
struct CPkt4
{
int a,b,c;
};
struct CLess4
{
typedef CPkt4 CXPkt;
};
template<class CLessT>
class CTcpStreamT
{
public:
typedef CLessT CLess;
typedef typename CLess::CXPkt CXPkt;
};
typedef CTcpStreamT<CLess4> CTcpStream4;
template<class CTcpStreamT>
class CTcpCollectorT
{
public:
typedef typename CTcpStreamT CTcpStream;
typedef typename CTcpStream::CXPkt CXPkt;
};
typedef CTcpCollectorT<CTcpStream4> CTcpCollector4;
class CTcpCollectorWrapper
{
public:
CTcpCollector4 m_TcpCollector4;
//здесь еще .. CTcpCollector6 m_TcpCollector6;
template<class CTcpCollectorT>
int _process_packetT(CTcpCollectorT& collector, /*CPkt4&*/ typename CTcpCollectorT::CXPkt& a)
{
printf("%d %d %d \n",a.a,a.b,a.c);
return 0;
}
};
int main(int argc, char* argv[])
{
CTcpCollectorWrapper w;
CTcpCollector4::CXPkt x = {12,13,14};
w._process_packetT(w.m_TcpCollector4, x);
return 0;
}
ура! нашел! просто заменил в пред.примере
template<class CTcpCollectorT> int _process_packetT(T& collector, typename CTcpCollectorT::CXPkt& a)
на
template<class T> int _process_packetT(T& collector, typename T::CXPkt& a)
ну, надо же. получается , vc6 рассматривает параметры темплэйта как ужЕ существующие классы, если они есть. так что ли?
Здравствуйте, w40, Вы писали:
w40>ура! нашел! просто заменил в пред.примере
w40>w40>template<class CTcpCollectorT> int _process_packetT(T& collector, typename CTcpCollectorT::CXPkt& a)
w40>
w40>на
w40>w40>template<class T> int _process_packetT(T& collector, typename T::CXPkt& a)
w40>
w40>ну, надо же. получается , vc6 рассматривает параметры темплэйта как ужЕ существующие классы, если они есть. так что ли?
я до сих пор ...
ну, блин, это всё равно, что компилятор будет выдавать ошибку на одинаковые именА переменных, объявленных в разных скопах!