2013-04-26 3 views
0

g ++ встретить ошибку на этом образце.Templated function function call g ++ error: нет соответствующей функции для вызова

У меня есть класс Option который содержит std::string

OptionValue унаследовал от Option с типом шаблона и шаблонным аргументом типа std::string для ключа.

OptionManager управлять OptionValue в std::map<std::string, Option*> OptionManager имеют функцию члена create:

template <typename T, std::string & key> 
    void create(const T & value); 

г ++ не ругаются, если я не призываю:

OptionManager *manager = new OptionManager; 
    manager->create<int, "my_key">(3); 

г ++ не нравится create звонок, вот ошибка: no matching function for call to OptionManager::create(int)

Если кто-то может мне помочь, показывая мне дорогу, я очень благодарен ему! :)

Вот код:

Option.hpp

class         Option 
{ 
public: 
    Option(std::string & key) : 
    key_(key) 
    {} 

    virtual ~Option() 
    {} 

protected: 
    std::string       key_; 
}; 

OptionValue.hpp

template        <typename T, std::string & key> 
class         OptionValue : public Option 
{ 
public: 
    OptionValue<T, key>(T val) : 
    Option(key), 
    val_(val) 
    {} 

    virtual ~OptionValue() 
    {} 

private: 
    T          val_; 
}; 

OptionManager.hpp

class         OptionManager 
{ 
public: 
    OptionManager(){} 
    ~OptionManager(){} 
    template        <typename T, std::string & key> 
    void         create(const T & value) 
    { 
    Option        *tmp; 

    tmp = new OptionValue<T, key>(value); 
    this->list_.insert(t_pair(key, tmp)); 
    } 
private: 
    std::map<std::string, Option*>      list_; 
    typedef std::map<std::string, Option*>::iterator  t_iter; 
    typedef std::pair<std::string, Option*>    t_pair; 

};

main.cpp

int        main() 
{ 
    OptionManager     *manager; 

    manager = new OptionManager; 
    manager->create<int, "my_key">(3); 
    return 0; 
} 

г ++ ошибка

main.cpp: In function ‘int main()’: 
main.cpp:8:35: error: no matching function for call to ‘OptionManager::create(int)’ 
main.cpp:8:35: note: candidate is: 
OptionManager.hpp:14:12: note: template<class T, std::string& key> void OptionManager::create(const T&) 
+1

Это самое оригинальное форматирование кода, которое я видел целую вечность. Это ужасно. – john

ответ

1

Ваш второй параметр шаблона типа std::string &. Вы не можете инициализировать это с помощью временного объекта (как, в вашем случае, созданного путем преобразования строкового литерала в std::string).

+0

Цистерны! Вы мне очень помогаете! – cesarl