2015-07-16 4 views
3

Следующая игрушечная программа преобразует тип музыки в соответствующий цвет. Он компилирует и выполняет только штраф - преобразование COUNTRY не выполняется, как и ожидалось, и функция conversion() возвращает значение по умолчанию, WHITE. Однако, если я удаляю аргументы шаблона, <MUSIC, COLOR>, вывод аргумента шаблона не распознает, какие типы использовать. Как я могу заставить дедукцию работать?Почему не работает вывод шаблона?

#include <map> 
#include <iostream> 
#include "boost/assign.hpp" 

template<typename Key, typename T> 
T convert(const Key &k, const T &d, const std::map<Key, T> &m) { 
    typename std::map<Key, T>::const_iterator it = m.find(k); 
    return it == m.end() ? d : it->second; 
} 

enum MUSIC { ROCK, RAP, EDM, COUNTRY }; 
enum COLOR { RED, BLUE, ORANGE, WHITE }; 

int main() 
{ 
    COLOR c = convert<MUSIC, COLOR>(COUNTRY, WHITE, 
     boost::assign::map_list_of (RAP, RED) (EDM, BLUE) (ROCK, RED)); 
    std::cout << c << std::endl; 
} 
+0

Что произойдет, если вы добавите аргумент шаблона для типа карты, а? – jxh

+0

template