1

次のコードはGCC4.5.3でコンパイルされますが、VS 2008および2010ではコンパイルされません。これはVSコンパイラのバグによるものですか、それとも標準ではデフォルトの関数テンプレート引数値の指定が禁止されていますか?

#include <cstdlib>

struct Bar
{
    enum Group{ A , B , C };
};

struct Foo
{
    template<typename T>
    static void getSome( typename T::Group = T::A );
};

template<typename T>
void Foo::getSome( typename T::Group )
{
};

int main()
{
    Foo::getSome<Bar>();            // Does not compile in VS 2008 & 2010 (compiles in gcc 4.5.3)
    Foo::getSome<Bar>( Bar::C );    // Compiles in VS 2008 and gcc 4.5.3
    return EXIT_SUCCESS;
}

エラーメッセージ

prog.cpp(11) : error C2589: '::' : illegal token on right side of '::'
prog.cpp(11) : error C2059: syntax error : '::'
4

2 に答える 2

6

これはMSVCのバグです。

ご想像のとおり、バグはデフォルトのパラメータを使用したテンプレート関数の処理にあります。

それらの回避策は、すべての関数パラメーターを提供することです。 (うん)

ここで認められました。

于 2013-02-11T12:46:27.423 に答える
3

g++スニペットをコンパイルするときは、標準に準拠していると思います。

次の抜粋は、標準の右側の部分(セクション14.1.9)への参照である必要があります。

デフォルトのtemplate-argumentは、template-parameterの=の後に指定されたtemplate-argument(14.3)です。デフォルトのtemplate-argumentは、テンプレートパラメーターパック(14.5.3)ではない任意の種類のtemplate-parameter(type、non-type、template)に対して指定できます。デフォルトのtemplate-argumentは、テンプレート宣言で指定できます。デフォルトのtemplate-argumentは、メンバーのクラスの外部に表示されるクラステンプレートのメンバーの定義のtemplate-parameter-listsで指定してはなりません。デフォルトのtemplate-argumentは、フレンドクラステンプレート宣言で指定してはなりません。フレンド関数テンプレート宣言がデフォルトのtemplate-argumentを指定する場合、その宣言は定義であり、変換ユニット内の関数テンプレートの唯一の宣言である必要があります。

于 2013-02-11T12:46:45.633 に答える