4

次のコードはC++98/03でコンパイルする必要がありますか?

struct Base
{
    template <typename T> void func () { }
    void norm() {  }
};

struct Derived : public Base { };

template <typename U>
struct Usage
{
    typedef void (U::*Method)();

    Usage(Method test) { }
};

int main()
{
    Usage<Derived> good(&Derived::norm);

    // "Error: Cannot use void(*)() to initialize Usage<Derived>." on next line
    Usage<Derived> bad(&Derived::func<int>);

    return 0;
}

このコードスニペットは、私が試すことができたほぼすべてのコンパイラで問題なく機能しました。Sun C++5.11およびSunC++5.12を保存します。

それはバグでしょうか?もしそうなら、それがベンダー(現在はOracle)に報告されているかどうか誰かが知っていますか?

編集:

C++03またはC++11標準文書のいずれかから適切な関連する引用を提供する回答を受け入れます。または、Oracleでバグレポートに関する情報を提供できる場合。

4

1 に答える 1

0

C++98 標準の第 14 章のほとんどを読んだところです。どの型が (特殊化された) テンプレート メンバーの結果となるかについてはあまり言及されていないため、テンプレート メソッドであることが作成されないという考えに従っていると思います。それは方法ではありません。少し時間があれば、C++1 がそれ​​について詳しく説明するかどうかを確認します。

C++ に関する私の一般的な考えから、あなたのコードはパスするはずだとわかっています。そして、コンパイラの大部分がそれに同意していることも手がかりですよね? :)

于 2013-03-26T04:32:33.393 に答える