20

コンパイルできないコードがいくつかあります。

namespace ns
{
    class foo
    {
        template <typename T> int bar (T *);
    };
}

template <typename T>
int ns :: foo :: bar (T*) // this is OK
{
    return 0;
}

template <>
int ns :: foo :: bar <int> (int *) // this is an error
{
    return 1;
}

エラーは次のとおりです。

コンパイルできるバージョンは次のとおりです。

namespace ns
{
    class foo
    {
        template <typename T> int bar (T *);
    };
}

template <typename T>
int ns :: foo :: bar (T*)
{
    return 0;
}

namespace ns
{
    template <>
    int foo :: bar <int> (int *)
    {
        return 1;
    }
}

namespace ns {}最初の定義は修飾名で非常にうまく定義されているのに、なぜ 2 番目の定義はブロック内になければならないのでしょうか? 言語設計の単なる見落としですか、それとも理由がありますか?

4

1 に答える 1