2014-01-16 6 views
0

가변성 템플레이트의 매개 변수 팩에있는 항목 수를 알아야합니다.variadic 템플리트의 sizeof C++

내 코드 :

#include <iostream> 

using namespace std; 



template <int... Entries> 
struct StaticArray 
{ 

    int size = sizeof... (Entries);// line A 
    //int array[size] = {Entries...};// line B 

}; 


int main() 
{ 
    StaticArray<1,2,3,4> sa; 
    cout << sa.size << endl; 

    return 0; 
} 

나는 그것은 컴파일 할 수

static const unsigned short int size = sizeof...(Arguments) 

에 선 A에
경우 변경이 줄을 컴파일 오류가 발생했습니다. 내 첫 번째 질문은 왜 "정적 const 부호없는 짧은"컴파일해야 얻을 수 있습니다. 보시다시피, 내 배열에 넣을 크기가 필요합니다. 내 최종 목표는이 배열을 주요 기능에서 인쇄 할 수 있습니다.

도와주세요. 나는이 멤버 변수의 새로운 수준의 초기화의의 처리 ++ g의 버그라고 생각 덕분에 .. 내 이상은이 웹 사이트에서 제공하지만 난 그 의견에 따라 경찰 http://thenewcpp.wordpress.com/2011/11/23/variadic-templates-part-1-2/

+0

그 멤버 초기화 구문을 지원하지 않는 컴파일러처럼 소리 (올바른 선언 아마 어쨌든 static constexpr std::size_t size 될 것이다, 그래서 물론, 크기는 ...이 문제를 피하고, 런타임에 변경할 수 없습니다) . –

+1

gcc의 버그처럼 보입니다. clang이 컴파일합니다. –

+0

[clang ++] (http://coliru.stacked-crooked.com/a/33375a8a3566ce4f)는 컴파일하지만 [g ++]는 컴파일하지 않습니다 (http://coliru.stacked-crooked.com/a/5f820aa2bce32acb) –

답변

1

를 작동하는 방법을 잘 모릅니다. 당신이

template <int... Entries> 
struct StaticArray 
{ 
    static const int size = sizeof...(Entries); // works fine 
}; 

에 코드를 변경하면이 동급 const 정적 핵심 멤버를 초기화하는의 C++ 03 특별한 경우를 사용하기 때문에 다음은 제대로 작동합니다. 새 C++ 11 균일 초기화 구문을 사용하는 경우

마찬가지로, 그것은 제대로 작동 :

template <int... Entries> 
struct StaticArray 
{ 
    int size{sizeof...(Entries)}; // no problem 
}; 

내가 지정 양식은 여기 유효 확신, 그래서 나는 g 생각 ++ (4.8.2 내 시스템에) 잘못 받고있다.