gpt4 book ai didi

c++ - 类静态成员的冲突声明

转载 作者:太空宇宙 更新时间:2023-11-04 12:59:29 25 4
gpt4 key购买 nike

#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) 的值(value)似乎具有误导性。我认为这个错误是合法的 NHs声明使类型成为 Hs取决于 Class2::N .如果你使用 Class2< T, Ns... >::NHs定义错误应该消失了:

#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;
}

working code online

实际上摆脱了N并使用 sizeof...(Ns)到处都会变短...

关于c++ - 类静态成员的冲突声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44858330/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com