Я попытался создать SSCE, потому что это обычно также помогает найти проблему на ранней стадии. Тем не менее, я не могу найти решение для этого, поэтому я хотел бы знать, можно ли определить аргумент, который является неуказанным указателем класса шаблона.Определение параметра в виде неопределенного типа шаблона
У меня есть определенный интерфейс и класс парсера, который должен обрабатывать детали реализации для xerces (например, перекодирование и все эти служебные данные). Класс интерфейса был бы разработан для создания объектов из анализатора (SAX), но без необходимости иметь дело с библиотекой xerces.
В Java я знаю, что я мог бы использовать неопределенный общий аргумент типа, как это:
class Parser
{
public Parser(IGenericInterface<?> oImpl) {};
}
И в основном я хотел бы знать, как это может быть сделано в C++. В приведенном ниже примере я получаю ошибку компилятора в строке, объявляющей переменную интерфейса, потому что ей не хватает типа. Но, конечно, в объявлении класса тип неизвестен и должен быть назначен во время выполнения, как показано в main
.
#include <iostream>
#include <string>
template <class T>
class IGenericInterface
{
public:
IGenericInterface() {};
virtual ~IGenericInterface() {};
virtual T *createInstance(void) = 0;
};
template <class T>
class Implementation : public IGenericInterface<T>
{
public:
Implementation() {};
virtual ~Implementation() {};
T *createInstance(void)
{
T * t = new T;
return t;
}
};
class Parser
{
public:
Parser(IGenericInterface *oImpl) { mImpl = oImpl; };
virtual ~Parser() { delete mImpl; };
void doSomething(void) { do whatrever is needed; t = createInstance(); };
private:
IGenericInterface *mImpl;
};
int main()
{
Parser *p = new Parser(new Implementation<int>());
sleep(3);
return 0;
}
Итак, как я должен определить Parser
конструктор, чтобы сделать его передать произвольный интерфейс аргумент?
Похоже, что ваш парсер зависит от шаблона аргумента '' IGenericInterface, так почему не 'Parser' шаблон тоже? –
dyp
Не стесняйтесь процитировать ошибки компилятора дословно. Указывая, какой номер строки там, где также редко болит. –
В вашем примере никогда не используется 'CreateInstance'. Мне немного бессмысленно определять шаблон, если вы не собираетесь использовать единственное, что он предлагает. Как вы планируете использовать «CreateInstance»? –