2013-11-09 4 views
1
template<class T> 
inline T Library<T>::get_isbn() 
{ 
    T temp; 
    cout << "Enter the name/no:" << endl; 
    cin >> temp; 
    string ka; 
    if (typeid(temp) == typeid(ka)) 
    { 
     while (islower(temp[0])) 
     { 
      cout << " Pls enter the using the first letter as capital" << endl; 
      cin >> temp; 
     } 
    } 
} 
return temp; 
} 

Я создаю класс шаблона, который может принимать либо целый или string в качестве параметра шаблона и при создании объекта класса с T как string, он собирается в цикле и работает все отлично , Но когда я создаю объект с int в качестве параметра шаблона, он дает мне после двух ошибок:Использование TypeId с шаблонами

ошибка C1903: не удается оправиться от предыдущей ошибки (ов); остановка сборник

ошибка C2228: слева от «.at» должен иметь класс/структуры/объединения

Я хочу, что если передаваемый параметр string, то только код для проверки первого алфавита, чтобы быть столицей должен выполняться, иначе, когда я задаю параметр шаблона как int, он не должен проверять первую вещь алфавита.

+0

После форматирования вы, кажется, слишком много закрывающих скобок '}'. – dyp

+1

Ваш код не содержит вызовов на(), поэтому вы не опубликовали фактический код. –

ответ

3

if в C++ всегда (семантически) решение во время выполнения. Он может быть оценен компилятором во время компиляции, а неиспользуемая ветвь отбрасывается. Но это может не означает его must. Вы все равно должны убедиться, что все ветви содержат действительный код.

В этом примере выражение temp[0] плохо сформировано, если temp является целым числом. Простейшим решением было бы вызвать перегруженную функцию внутри вашей общей функции - обратите внимание: вводя typeid -branching, ваш алгоритм по своей сути не является общим, он требует специального лечения для некоторых типов.

template<class T> 
void get_isbn_impl(T&) 
{ 
    // default implementation 
} 

void get_isbn_impl(string& str) 
{ 
    // special version for `string` 
    while (islower(str[0])) 
    { 
     cout << " Pls enter the using the first letter as capital" << endl; 
     cin >> str; 
    } 
} 

template<class T> 
inline T Library<T>::get_isbn() 
{ 
    T temp; 
    cout << "Enter the name/no:" << endl; 
    cin >> temp; 

    get_isbn_impl(temp); 

    return temp; 
} 

Также можно специализироваться либо Library<string> (весь класс) или просто Library<string>::get_isbn.

Смежные вопросы