初めまして。
初めて質問させていただきます。

私は現在、C++でSTLを用いずにポインタを用いた双方向リストを自作する事に取り組んでいます。
そんななか、とりあえず最後尾に要素を追加する所までは書いたのですが、それをfor文で回そうとしても飛ばされてしまいます(処理されない)。

ブレークポイントを用いて何が原因なのか突き止めようともしたのですが、NULLになっているわけでもなく、結局力及ばず解決には至っていません。

C++の経験が浅く、ポインタに関してどこか見落としているのかもしれないのですが、どなたかご教授をお願いいたします。

BidirectionalList.h

//双方向リストクラス
template <typename T>
class BidirectionalList
{
public:
    BidirectionalList();
    T* begin();
    T* end();
    void push_back(T pushData);
private:
    template <typename T>
    //各要素の構造体
    struct ListItem
    {
        T* data;
        ListItem* prev;
        ListItem* next;
        ListItem() :
            data(nullptr),
            prev(nullptr),
            next(nullptr){}
        ListItem(T* newData) :
            data(newData),
            prev(nullptr),
            next(nullptr) {}
    };
    ListItem<T>* head;
    ListItem<T>* tail;
    ListItem<T>* nowItem;
};

BidirectionalList.cpp

template <typename T>
BidirectionalList<T>::BidirectionalList():
    head(new ListItem<T>()),
    tail(new ListItem<T>()),
    nowItem(head)
{}

template <typename T>
void BidirectionalList<T>::push_back(T pushData)
{
    ListItem<T> *newItem = new ListItem<T>(&pushData);
    nowItem->next = newItem;
    newItem->prev = nowItem;
    newItem->next = tail;
    tail->prev = newItem;
    nowItem = newItem;
}

template <typename T>
T* BidirectionalList<T>::begin()
{
    ListItem<T> *item = nowItem;
    while (item->prev != head)
    {
        item = item->prev;
    }
    return item->data;
}
template <typename T>
T* BidirectionalList<T>::end()
{
    ListItem<T> *item = nowItem;
    while (item->next != tail)
    {
        item = item->next;
    }
    return item->data;
}

使用時

BidirectionalList<IHoge*> objList;
//IHogeを継承したクラスをnew
objList.push_back(new HogeA());
objList.push_back(new HogeB());
objList.push_back(new HogeC());
objList.push_back(new HogeD());
for (IHoge* obj : objList)
{
    //呼ばれない
    obj->HogeFunc();
}