簡體   English   中英

類靜態成員的聲明沖突

[英]conflicting declaration of class static member

#include <iostream>
#include <utility>

using namespace std;

template<typename>
struct Class1;

template<size_t...Is>
struct Class1<index_sequence<Is...>> {
    template<typename T, size_t N>
    struct Holder {
        constexpr Holder(T const(&Ns)[N]) : data{T(Ns[Is] * Is)...} {
        }

        T data[N];
    };
};

template<typename T, T...Ns>
class Class2 {
public:
    static constexpr const size_t N = sizeof...(Ns);
    static constexpr const T mNs[] = {Ns...};
    static constexpr const typename Class1<make_index_sequence<N>>::template Holder<T, N> Hs{mNs}; 
    // If I replace the above N with sizeof...(Ns), the error is gone.
};

template <typename T, T...Ns>
constexpr const typename Class1<make_index_sequence<sizeof...(Ns)>>::template Holder<T, sizeof...(Ns)>
        Class2<T, Ns...>::Hs; // g++ error: conflicting declaration.

int main() {
    cout << &Class2<int, 1, 2, 3>::Hs << endl;
}

這是我的代碼的簡化版本。 它在VS中編譯,因為VS不符合該要求。 但是無法在g ++ 6.3下編譯。 Class2 <...> :: Hs的確切類型是什么?

基本上,我需要在編譯時使用另一個數組的元素和該元素的索引來初始化數組。 因此,如果有更好的方法,那就更好了。

N將保持sizeof...(Ns)的值的事實似乎具有誤導性。 我認為,這個錯誤是合法的使用NHs聲明使得類型Hs取決於Class2::N 如果在Hs定義中使用Class2< T, Ns... >::N應該消失:

#include <iostream>
#include <utility>
#include <cstddef>

template< typename > struct
Class1;

template< ::std::size_t...Is > struct
Class1< ::std::index_sequence< Is... > >
{
    template< typename T, ::std::size_t N > struct
    Holder
    {
        constexpr
        Holder(T const(&Ns)[N])
        :   data{T(Ns[Is] * Is)...}
        {}

        T data[N];
    };
};

template< typename T, T...Ns > class
Class2
{
    public: static constexpr const ::std::size_t N{sizeof...(Ns)};
    public: static constexpr const int mNs[]{Ns...};
    public: static constexpr const typename Class1< ::std::make_index_sequence< N > >::
        template Holder< T, N > Hs{mNs};
};

template< typename T, T...Ns >
constexpr const typename Class1< ::std::make_index_sequence< Class2< T, Ns... >::N > >::
    template Holder< T, Class2< T, Ns... >::N > Class2< T, Ns... >::Hs;

int
main()
{
    ::std::cout << &Class2<int, 1, 2, 3>::Hs << ::std::endl;
}

在線工作代碼

實際上擺脫N並在各處使用sizeof...(Ns)會更短...

暫無
暫無

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

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