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模板参数,当我使用Tas创建类的对象时string,它会进入循环并且一切正常。int但是当我使用模板参数创建一个对象时,它给了我以下两个错误:

错误 C1903:无法从先前的错误中恢复;停止编译

错误 C2228:'.at' 左侧必须有类/结构/联合

我希望如果传递的参数是string,那么只有检查第一个字母为大写的代码应该运行,否则当我将模板参数指定为int时,它不应该检查第一个字母。

4

1 回答 1

3

C++ 中的ifA 始终(语义上)是运行时决策。它可能会在编译时由编译器评估,而未使用的分支则被丢弃。但这可能并不意味着它必须。您仍然必须确保所有分支都包含有效代码。

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.

于 2013-11-09T10:11:30.950 回答