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;
}

整数またはテンプレート パラメータのいずれかを取ることができるテンプレート クラスを作成しています。 asstringを使用してクラスのオブジェクトを作成すると、ループに入り、すべて正常に動作します。しかし、テンプレート パラメーターとしてオブジェクトを作成すると、次の 2 つのエラーが発生します。Tstringint

エラー C1903: 以前のエラーから回復できません。コンパイルの停止

エラー C2228: '.at' の左側にはクラス/構造体/共用体が必要です

渡されたパラメーターが の場合string、最初のアルファベットが大文字であることを確認するためのコードのみを実行する必要がありますint

4

1 に答える 1

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.

于 2013-11-09T10:11:30.950 に答える