2

に対しては機能しますが、に対しては機能しstruct RS : public JV<T,1>ませんstruct RS : public JV<T,2>

error: could not convert ‘{(0, j), (0, j)}’ from ‘&lt;brace-enclosed initializer list>’ to ‘WJ<float>’

オーバーロードする必要がありoperator,()ますか?コード:

#include<iostream>

struct B {};

template <std::size_t... Is>
struct indices {};

template <std::size_t N, std::size_t... Is>
struct build_indices
  : build_indices<N-1, N-1, Is...> {};

template <std::size_t... Is>
struct build_indices<0, Is...> : indices<Is...> {};

template<class T,int N>
struct JV {

  JV(B& j) : JV(j, build_indices<N>{}) {}
  template<std::size_t... Is>
  JV(B& j, indices<Is...>) : jit(j), F{{(void(Is),j)...}} {}

  B& jit;
  T F[N];
};

template<class T>
struct RS : public JV<T,2>
{
  RS(B& j): JV<T,2>(j) {}
};

template<class T>
struct WJ
{
  WJ(B& j) {
    std::cout << "WJ::WJ(B&)\n";
  }
};

int main() {
  B j;
  RS<WJ<float> > b2(j);
}
4

3 に答える 3

4

{}プレーン配列を使用する場合は、余分なものを削除する必要がありますF{(void(Is),j)...}。またはstd::array<T, N> F、あなたが言ったように変更します。

ただし、単純な配列は単に{}初期化に使用しstd::array、配列を含む集合体であるため、二重中括弧を使用します。

より良い説明については、初期化リストでの std::array の使用を参照してください。

于 2012-10-12T10:43:25.350 に答える
2

あなたの問題は、余分な{}ブレースのペアです。変化する

  JV(B& j, indices<Is...>) : jit(j), F{{(void(Is),j)...}} {}

  JV(B& j, indices<Is...>) : jit(j), F{(void(Is),j)...} {}

そしてそれはうまくいきます。

それが機能する理由std::arrayは、実際の配列を含むarray集約であるためです。

// from 23.3.2.1 [array.overview]
namespace std {
  template<typename T, int N>
  struct array {
...
    T elems[N];    // exposition only

したがって、 を初期化するには、実際の配列arrayを初期化する場合と比較して、追加の中かっこのペアが必要です。gcc では余分な中括弧を省略できますが、次のように不満があります。

  std::array<int, 3>{1, 2, 3};

警告: 'std::array::value_type [3] {aka int [3]}' [-Wmissing-braces] の初期化子を囲む括弧がありません

于 2012-10-12T10:45:26.060 に答える
1

交換

 T F[N];

 std::array<T,N> F;

トリックをしました!std::arrayCアレイ以上のことができるようです。

于 2012-10-12T10:41:10.887 に答える