簡體   English   中英

可變參數模板元編程:clang ++或g ++中的錯誤?

[英]Variadic template metaprogramming : a bug in clang++ or g++?

考慮這種可變參數模板瘋狂將數組從一種類型轉換為另一種類型:

#include <array>
#include <type_traits>

template <typename Type>
class Converter
{
    public:
        template <typename OtherType, unsigned int OtherSize, class Array, typename... Types, class = typename std::enable_if<sizeof...(Types) != OtherSize>::type> 
        static constexpr const std::array<OtherType, OtherSize> convert(const Array source, const Types&... values);
        template <typename OtherType, unsigned int OtherSize, class Array, typename... Types, class = typename std::enable_if<sizeof...(Types) == OtherSize>::type> 
        static constexpr const std::array<OtherType, OtherSize> convert(const Array, const Types... values);
};

template <typename Type>
template <typename OtherType, unsigned int OtherSize, class Array, typename... Types, class> 
constexpr const std::array<OtherType, OtherSize> Converter<Type>::convert(const Array source, const Types&... values)
{
    return convert<OtherType, OtherSize>(source, values..., OtherType(source[sizeof...(values)]));
}

template <typename Type>
template <typename OtherType, unsigned int OtherSize, class Array, typename... Types, class> 
constexpr const std::array<OtherType, OtherSize> Converter<Type>::convert(const Array, const Types... values)
{
    return std::array<OtherType, OtherSize>({{values...}});
}

int main(int argc, char* argv[])
{
    Converter<double>::convert<int, 3>(std::array<double, 3>({{1., 2., 3.}}));
    return 0;
}

這段代碼在g ++ 4.7和g ++ 4.8下編譯得很好,但在clang ++ 3.2下卻沒有編譯:

main.cpp:16:67: error: conflicting types for 'convert'
constexpr const std::array<OtherType, OtherSize> Converter<Type>::convert(const Array source, const Types&... values)
                                                                  ^
main.cpp:9:65: note: previous declaration is here
        static constexpr const std::array<OtherType, OtherSize> convert(const Array source, const Types&... values);
                                                                ^
main.cpp:23:67: error: conflicting types for 'convert'
constexpr const std::array<OtherType, OtherSize> Converter<Type>::convert(const Array, const Types... values)
                                                                  ^
main.cpp:11:65: note: previous declaration is here
        static constexpr const std::array<OtherType, OtherSize> convert(const Array, const Types... values);

g ++是否過於寬松,或者它是clang ++中的錯誤(如果是這樣,是否存在clang ++的公共錯誤跟蹤器)?

是的,這就是已經在clang和修復中報告的這個bug

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM