C ++, шаблоны с параметрами по умолчанию - PullRequest
0 голосов
/ 17 мая 2011

Упрощенный пример:

Существует абстрактный класс шаблона 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";
}

1 Ответ

1 голос
/ 17 мая 2011

Ваш код полностью компилируется для меня, вы не даете нам код, который у вас действительно есть.Кроме того, ваша проблема заключается в том, что вы хотите ввести неверные данные.Ваша функция test ожидает контейнер указателей на точки (Cont< Point<T>* >), но вы предоставляете контейнер точек (Cont< Point<T> >):

Cont< Point<int> >* pc;
// ...
test(pc);

Это, конечно, приведет к полученной вами ошибке.Вам нужен

Cont< Point<int>* >* pc;

То есть контейнер указателей.Вы делаете это правильно в своем вопросе, но ваш реальный код, похоже, не таков.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...