Упрощенный пример:
Существует абстрактный класс шаблона GCont, представляющий общий контейнер
template <typename Item>
struct TList
{
typedef std::vector <Item> Type;
};
template <typename Item>
class GCont
{
protected:
typename TList <Item>::Type items;
public:
typedef Item type;
virtual ~GCont() = 0 {};
};
, и производный абстрактный шаблон класса, имеющий один неявный параметр
template < typename Item, const bool par = true>
class GCont2 : public GCont <Item>
{
public:
GCont2 () : GCont <Item> () {}
virtual ~GCont2() = 0 {};
};
и его специализация для указателей
template <typename Item, const bool par>
class GCont2 <Item *, par> : public GCont <Item *>
{
public:
GCont2 () : GCont <Item *> () {}
virtual ~Cont() {}
};
Производный шаблон класса Cont
template <typename Point, const bool par = true>
class Cont : public GCont2 <Point, par>
{
public:
Cont() : GCont2 <Point, par>() {}
virtual ~Cont() {}
};
и специализация для указателей
template <typename Point, const bool par>
class Cont <Point *, par> : public GCont2 <Point *, par>
{
public:
Cont() : GCont2 <Point *, par> () {}
};
Класс Point:
template <typename T>
class Point
{
protected:
T x, y, z;
};
Можно ли написать функцию test (), имеющую универсальный формальный параметр, позволяющий использовать в моей программе
Cont <Point <T> *> *points
и
Cont <Point <T> *, false> *points
template <typename T>
void test (Cont <Point <T> *> *points)
{
std::cout << "test";
}
template <typename T>
void test2 (Cont <Point <T> *, false> *points)
{
std::cout << "test2";
}
int _tmain(int argc, _TCHAR* argv[])
{
Point <double> * p = new Point <double>();
Cont <Point <double> *, false> points;
test(&points); //Error
test2(&points); //OK
return 0;
}
Во время перевода появляется следующая ошибка:
Error 1 error C2784: 'void test(Cont<Point<T>*> *)' : could not deduce template argument for 'Cont<Point<T>*> *' from 'Cont<Point,par> *' g:\templates_example.cpp 27
Спасибо за помощь ...
Обновлен статус :
Iобрезал код ... Но проблема осталась ... Мой код не компилируется с той же ошибкой при использовании MSVS 2010.
Я нашел частичное решение-шаблонизацию контейнера.
template <typename Container>
void test (Container *points)
{
std::cout << "test";
}