Неполный тип как параметр функции? - PullRequest
1 голос
/ 09 июля 2010

У меня есть тот шаблонный класс, который использует политику для своего вывода и другой аргумент шаблона, чтобы определить тип для его элементов данных.Кроме того, конструктор берет указатели на базовые классы, которые хранятся в частных указателях.Функции этих объектов должны принимать указатель this на класс шаблона, чтобы предоставить им доступ к данным.В коде это выглядит так:

class ShapeGenerator;

template <typename PointData, typename OutputPolicy> class ModelCreator {
private:
    OutputPolicy output;
    ShapeGenerator* shape
    std::vector<PointData> data;
public:
    ModelCreator (ShapeGenerator *s) : shape(s) { }
    void createShape() { shape->generateShape(this); }
};

ShapeGenerator является интерфейсом и должен быть реализован.Это выглядит так:

class ShapeGenerator {
public:
    void generateShape (ModelCreator* m) = 0;
};

Если я скомпилирую это с помощью g ++ 4.3.4 (cygwin), я получаю ошибку в ShapeGenerator :: generateShape, говорящую 'ModelCreater' is not a type.Я вставил предварительную декларацию ModelCreator, но она ничего не изменила.Я играл с некоторыми комбинациями типов и параметров, например, передавая только вектор, и затем я получил сообщение об ошибке, в котором говорилось что-то о неполных типах.Я полагаю, в этом проблема.

Итак, возможно ли передать шаблонный тип без особых аргументов?Если да, то как?

edit: Я не связан с именем типа ModelCreator.Если мне нужно написать больше шаблонов, это не проблема.Но я бы не хотел указывать типы ModelCreator в объекте ShapeCreator.Это возможно?

edit2: Хорошо, я думаю, я был немного оптимистичен с этим "дизайном".Было бы неплохо просто добавить немного ингредиентов и получить суп.Но теперь соль должна знать о типе воды в кастрюле.Я изменю шаблоны на простую старую композицию.Спасибо вам, ребята.

Ответы [ 2 ]

3 голосов
/ 09 июля 2010

Если вы хотите использовать ModelCreator с «бесплатными» параметрами шаблона, то вы должны также сделать ShapeGenerator шаблоном:

template <typename PointData, typename OutputPolicy> 
class ShapeGenerator {
public:
    void generateShape (ModelCreator<PointData,OutputPolicy>* m) = 0;
};

или

template <template <typename, typename> class ModelCreator> 
class ShapeGenerator {
public:
    void generateShape (ModelCreator* m) = 0;
};

Вторая версия принимает другой шаблон в качестве параметра. Вы бы использовали это так:

ShapeGenerator<ModelCreator<PointDataType,OutPutPolicyType> > shapeGenerator; 
1 голос
/ 09 июля 2010

Вам также необходимо сделать ShapeGenerate шаблонным классом:

template <typename PointData, typename OutputPolicy>
class ShapeGenerator;

template <typename PointData, typename OutputPolicy>
class ModelCreator {
private:
    OutputPolicy output;
    ShapeGenerator< PointData, OutputPolicy >* shape;    
    std::vector<PointData> data;
public:
    ModelCreator (ShapeGenerator< PointData, OutputPolicy >* s) : shape(s) { }
    void createShape();
};

template <typename PointData, typename OutputPolicy>
class ShapeGenerator {
public:
    void generateShape (ModelCreator< PointData, OutputPolicy> * m) = 0;
};

template <typename PointData, typename OutputPolicy>
void ModelCreator< PointData, OutputPolicy >::createShape() { shape->generateShape(this); }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...