2012-12-02 2 views
3

내가 같은 자식 메서드 내에서 클래스의 가변 인자 템플릿 유형 목록을 확장하기 위해 노력하고있어 :명시 전문화 [MSVS '12 : 11월을 '12 CTP : 오류 C3522]

template<typename... P> 
struct Foo 
{ 
    template<P...> // error C3522: 'P' : parameter 
        // pack cannot be expanded in this context 
    static void Bar(P... a){} 
}; 

이 코드의 문제점 또는 MSVS '12 : 11 월 12 일 CTP 버그입니까?

은 (예,이 예에서 명시 적 템플릿 특수화 중복 알고있다.)

위의 내가 오류를 재현 할 수 간단한 경우입니다. 전체 코드는 다음과 같습니다

template<typename FuncSignature> 
class Callback; 

template<typename R, typename... P> 
class Callback<R (P...)> 
{ 
public: 

    Callback()     : func(0), obj(0) {} 

    Callback& operator=(const Callback& rhs) 
    { obj = rhs.obj; func = rhs.func; return *this; } 

private: 
    typedef R (*FuncType)(const void*, P...); 
    Callback(FuncType f, const void* o) : func(f), obj(o) {} 

private: 
    FuncType func; 
    const void* obj; 

    template<typename FR, typename... FP> 
    friend class FreeCallbackFactory; 
}; 

template<typename R, typename... P> 
class FreeCallbackFactory 
{ 
private: 
    template<R (*Func)(P...)> 
    static R Wrapper(const void*, P... a) 
    { 
     return (*Func)(a...); 
    } 

public: 
    template<R (*Func)(P...)> 
    inline static Callback<R (P...)> Bind() 
    { 
     return Callback<R (P...)> 
      (&FreeCallbackFactory::Wrapper<Func>, 0); 
    } 
}; 
template<typename R, typename... P> 
inline FreeCallbackFactory<R, P...> 
    GetCallbackFactory(R (*)(P...)) 
{ 
    return FreeCallbackFactory<R, P...>(); 
} 

void Test(){} 

int main(int argc, char** argv){ 
Callback<void()> cb = GetCallbackFactory(&Test).Bind<&Test>() 
} 

너무 난 그냥 컴파일러의 버그가 있으리라 믿고있어 ++ g에서 잘 컴파일이 계속 발견 여전히 포인트는 하나 그들을 밖으로 확대 명시 적으로보다이 기타에 대한 가능한 해결 방법이 있습니다 하나씩?


편집 :

template <P...> 
static void Bar(P... a); 

이 템플릿으로 P... 값을 복용 함수를 선언 선언을 :This has been reported to the compiler team as a bug and a patch will be in the next release of the compiler. [Link]

답변

1

코드는 나는 그것이 당신이 그것을 의도하지 의심 올바른 넣어 본다 인수 및 함수 인수로. 즉, P의 요소는 유형이 아닌 매개 변수 (예 : 정수, 포인터 또는 참조)를 허용하는 유형이어야하며 함수를 호출 할 때 템플릿 매개 변수로서 각각의 값을 제공해야합니다. (가도 GCC도 그 소리가 전달되는 템플릿 매개 변수가 필요 보이지만)이 같은 함수를 호출은 다음과 같이 보일 것입니다 : GCC와 그 소리 모두에 의해 생성 된 오류 메시지를 기반으로 말했다

Foo<int, int>::Bar<1, 2>(3, 4); 

그것들은 당신이 멤버 함수 템플릿의 전문화를 만들지는 못하지만 표준에서 이것을 검증하지는 못했습니다. 제 생각에는 아마 템플릿 선언을 생략하고 사용해야합니다.

static void Bar(P... a); 
+0

이것은 MSVC : 11 월 12 일 CTP에 관한 것입니다. 그것은 내가 그 오류를 재현 한 가장 간단한 경우였다. 내가 프로젝트의 MSVC를 사용해야하지만 GCC에서 잘 컴파일되는 전체 코드로 질문을 업데이트했습니다. 지금까지 도움을 주셔서 감사 드리며 non-type 매개 변수에 대한 이해를 돕습니다. – LostOfThought

0

나에게 코드가 올바르게 보이지 않습니다. 팩 확장 P ...는 일련의 유형으로 확장됩니다. 올바른 작업을 수행하려는 목적에 따라 template<P...> 부분을 제거해야합니다.이 경우 각 클래스 템플릿 인스턴스에는 클래스와 동일한 매개 변수가있는 하나의 Bar() 메소드가 있습니다. ,

template<typename... U> static void Bar(U...); 

매우 유용하지 않을 것입니다 이름 P를 재사용 : 다른이가 당신이 좋아하는 방법 뭔가를 선언해야하는 경우, 방법의 무제한의 세트가 생성되는 경우에 관련되지 않은 매개 변수 팩입니다 것 그렇 겠지.