2012-10-12 112 views
1

它適用於struct RS : public JV<T,1>而不是struct RS : public JV<T,2>轉換。無法從<括號內的初始化列表>

error: could not convert ‘{(0, j), (0, j)}’ from ‘<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); 
} 

回答

1

更換

T F[N]; 

std::array<T,N> F; 

的伎倆!看來std::array可以比C數組做得更多。

+3

'std :: array'不一定能做比C風格的數組更多的功能,只是初始化的行爲不同。 C風格的只需要一個對大括號,而'的std :: array'是聚合(從而使'{...}'初始化即使在C++ 03)。第二對大括號是內部C風格的數組成員。 – Xeo

4

如果您想使用普通數組F{(void(Is),j)...},則需要刪除多餘的{}。或者像你說的那樣把它改成std::array<T, N> F

一個普通數組只是使用{}進行初始化,然而std::array是一個包含數組的集合,因此它使用了雙大括號。

Using std::array with initialization lists一個更好的解釋。

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 ::數組:: VALUE_TYPE [3] {又名INT [3]}'[-Wmissing -dres]

+0

沒關係,它看起來像他們可以在形式僅省略'T X = {A};'。 –

相關問題