2017-10-21 13 views
8

Aşağıdaki std :: visit kullanımı, gcc 7.2 altında düzgün bir şekilde derleniyor ancak clang 5.0 altında derlenemiyor. Problemin ne olduğunu bilen kimse var mı? Bu hata İşte std :: varyantı ziyaret etmek, clang altında derlemek için başarısız oluyor 5

include/c++/7.2.0/variant:238:46: error: cannot cast 'std::variant<S1, S2>' to its private base class 
    'std::__detail::__variant::_Variant_storage<true, S1, S2>' 
    return __get(std::in_place_index<_Np>, std::forward<_Variant>(__v)._M_u); 

Godbolt bağlantısıdır gösterir: Bu bug 33222 bilinir https://godbolt.org/g/5iaKUm

+0

LibstdC++ 'nin varyantının, Clang'ın desteklemediği standart dışı bir özellik kullanması mümkün olabilir. -stdlib = libC++ 'ile derler. – chris

+0

Notice 'std :: get <0> (v)', 'std :: get (v)', vb, temelde aynı hatayla (ve aralarında daha az örnekleme adımı) başarısız olur. – aschepler

+0

Dupe-ness'i nasıl değerlendirdiğine bağlı olarak bir dupe olabilir: https://stackoverflow.com/q/46506387/2069064 – Barry

cevap

8

sadece ++ 'ın std::variant (ve diğer yapılara libstdc etkileyecek gibi görünüyor

#include <variant> 

struct S1 {int foo() { return 0; }}; 
struct S2 {int foo() { return 1; }}; 

using V = std::variant<S1, S2>; 

int bar() { 
    V v; 
    return std::visit([](auto& s) { return s.foo(); }, v); 
} 

ilk hata şudur aynı kombinasyonu kullanarak). Sorun, arkadaş işlevinin şablonlarla ilgili olması - daha fazla ayrıntı için konuya bakın.

LibC++ 'dan gelen varyasyon, libstdC++' nin kullandığı arkadaşların tekniğini kullanmıyor gibi görünüyor, bu nedenle bu arada geçici olarak libC++ 'a geçmek isteyebilirsiniz.

+0

Teşekkürler. Bir clang böcek gibi görünüyor. Böceğin clang dev dalına mı ait olduğunu bilen var mı? – user2736667

+0

@ user2736667 Şu an itibariyle, hayır, üzgünüm. Oldukça ciddi olacağından eminim, sonuçta bu durum sabit olacak. – Rakete1111

İlgili konular