模板元编程GCC错误[重复]

问题描述 投票:0回答:1

可能重复:
我必须在哪里以及为什么必须放置“template”和“typename”关键字?

GCC 4.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 ‘>’ token

是否有已知的解决方法可以让我回避这个问题?

编辑:MSVC 2010 成功地编译了这个。

c++ gcc
1个回答
2
投票

您需要添加

template

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

MSVC 2010 编译代码,因为它无法正确处理模板。

旁注

由于长期存在的错误,

MSVC 还将

size_t
注入到全局命名空间中。从技术上讲,您需要在其他编译器上包含正确的标头。

© www.soinside.com 2019 - 2024. All rights reserved.