0

重複の可能性:
「template」および「typename」キーワードをどこに、なぜ配置する必要があるのですか?

GCC4.5.3にはバグがあるようです。

#include <type_traits>

template <bool isFundamentalType, bool isSomething>
struct Foo
{
    template <typename T>
    static inline void* Do(size_t size);
};

template <>
struct Foo<true, false>
{
    template <typename T>
    static inline void* Do(size_t size)
    {
        return NULL;
    }
};

template <>
struct Foo<false, false>
{
    template <typename T>
    static inline void* Do(size_t size)
    {
        return NULL;
    }
};

class Bar
{
};

template <typename T>
int Do(size_t size)
{
    // The following fails
    return (int) Foo<std::is_fundamental<T>::value, false>::Do<T>(size);
    // This works -- why?
    return (int) Foo<false, false>::Do<T>(size);
}

int main()
{
    return Do<Bar>(10);
}

でコンパイル g++ bug.cpp -std=c++0x

エラー:

bug.cpp: In function ‘int Do(size_t)’:
bug.cpp:37:65: error: expected primary-expression before ‘&gt;’ token

この問題を回避できる既知の回避策はありますか?

編集:MSVC2010はこれをうまくコンパイルすることができました。

4

1 に答える 1

2

追加する必要がありますtemplate:

return (int) Foo<std::is_fundamental<T>::value, false>::template Do<T>(size);

MSVC 2010 はテンプレートを正しく処理しないため、コードをコンパイルします。

サイドノート

MSVCsize_tは、長期にわたってバグが解決されていないため、グローバル名前空間にも挿入されます。技術的には、他のコンパイラに適切なヘッダーを含める必要があります。

于 2012-10-31T04:29:27.303 に答える