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
作为模板参数的对象时,它会给我两个错误:
错误C1903:无法从先前的错误中恢复;停止 汇编
错误C2228:'。at'的左边必须有class / struct / union
我希望如果传递的参数是string
,那么只有用于检查第一个字母表为大写的代码才能运行,否则当我将模板参数设为int
时,它不应该检查对于第一个字母表的事情。
答案 0 :(得分:3)
C ++中的if
总是(语义上)是运行时决策。编译时编译器可以 进行评估,丢弃未使用的分支。但它可能并不意味着必须。您仍然必须确保所有分支都包含有效代码。
在此示例中,如果temp[0]
是整数,则表达式temp
格式不正确。最简单的解决方案是在泛型函数中调用重载函数 - 注意:通过引入typeid
- 分支,您的算法本身不再是通用的,它需要对某些类型进行特殊处理。
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
。