заводской шаблон - с шаблонами - PullRequest
0 голосов
/ 06 ноября 2011

У меня есть следующее в стороннем заголовочном ядре, которое я предпочел бы не трогать:

template<typename Iterator_T>
struct Tree
{
    template<typename Node_T>
    struct TypedNode;

    struct AbstractNode
    {
        AbstractNode(Iterator_T t)
        {
            ...
        }

        template<typename Rule_T>
        TypedNode<Rule_T>* NewChild()
        {
            TypedNode<Rule_T>* ret = new TypedNode<Rule_T>(this);
            AddChild(ret);
            return ret;
        }

        template<typename T>
        TypedNode<T>* GetFirstTypedChild();
    };

    template<typename Node_T>
    struct TypedNode : AbstractNode
    {
        ...
    };

    template<typename Rule_T, typename ParserState_T>
    void CreateNode(ParserState_T& p)
    {
        current = current->template NewChild<Rule_T>();
    }
};

template<typename Node_T>
struct TreeBuilder
{
    Tree<Iterator_T> tree;

    template<typename Rule_T>
    void CreateNode()
    {
        tree.CreateNode<Rule_T>(*this);
    }
};

и хотел бы добавить подкласс TypedNode в дерево с дополнительными методами и членами.Есть ли чистый способ сделать это без рефакторинга исходного кода?Я думаю, что суть проблемы заключается в следующем: TypedNode * ret = new TypedNode (this);

Похоже, что он может использовать Factory, возможно, за счет специализации экземпляра шаблона TypedNode и включения заголовка перед базовыми заголовками.Что-то вроде:

template<>
struct Tree<const char*>::TypedNode<SpecificRuleType>
{
    ...
};

Но он терпит неудачу, жалуясь на "слишком мало списков параметров шаблона".Наверное, что-то тривиально, но мойнемного ржавый:> (. Любые идеи будут оценены!

1 Ответ

0 голосов
/ 06 ноября 2011

Оба Tree и TypedNode являются шаблонами, ваша специализация должна быть:

template<> // for Tree<...>
template<> // for TypedNode<...>
struct Tree<const char*>::TypedNode<SpecificRuleType>
{
    ...
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...