Написал шаблонный класс:| Код | #include <map> #include <string> #include <boost/shared_ptr.hpp> #include <stdexcept>
template <typename TBase> class Factory { public: Factory(){} // template <typename TDerived> // inline Factory& Register (const std::string &name);
// inline TBase* Create(const std::string &name) const; private: Factory(const Factory&); Factory& operator=(const Factory&);
struct CreatorBase { virtual ~CreatorBase(){} virtual TBase* create() const = 0; };
template <typename TDerived> struct Creator : public CreatorBase { virtual TBase* create() const { return new TDerived(); } }; typedef boost::shared_ptr<CreatorBase> CreatorPtr; typedef std::map<std::string, CreatorPtr> Container;
Container container_; public: TBase* Create(const std::string &name) const { Container::const_iterator i = container_.find(name); if (i == container_.end()) throw std::runtime_error("Invalid class name \"" + name + "\""); return i->second->create(); } }; |
При попытке собрать любым gcc (версии 4.1...4.3) возникает ошибка:| Код | $ g++ -c factory.cpp factory.cpp: In member function ‘TBase* Factory<TBase>::Create(const std::string&) const’: factory.cpp:37: ошибка: expected `;' before ‘i’ factory.cpp:38: ошибка: нет декларации ‘i’ в этой области видимости factory.cpp:40: ошибка: нет декларации ‘i’ в этой области видимости |
Попробовал ради эксперимента собрать с помощью icc (Intel) - проблем нет. Вопрос, кто виноват - я что-то накосячил или это глюк gcc?
|