파생 클래스에서 클래스 템플릿의 부분 전문화는 기본 클래스에 영향을 미칩니다.

StackOverflow https://stackoverflow.com/questions/1413158

문제

나는 metafunction이있다 :

struct METAFUNCION
{
  template<class T>
  struct apply
  {
    typedef T type;
  };
};

그런 다음 도우미를 정의합니다.

template<class T1, class T2>
struct HELPER
{
};

그런 다음 위의 메타 기능에서 파생 된 두 번째 메타 기능이 있으며 Apply Struct의 부분 전문화를 정의합니다.

struct METAFUNCION2 : METAFUNCION
{
  template<class T1, class T2>
  struct apply<HELPER<T1, T2> > : METAFUNCION::apply<T2>
  {
  };
};

지금까지 너무 좋습니다 - 코드는 G ++ 4.3.2에 따라 컴파일됩니다. 그래서 나는 다음과 같이 사용했습니다.

#include <typeinfo>
#include <string>
#include <cstdlib>
#include <cxxabi.h>

template<typename T>
struct type_info2
{
  static std::string name()
  {
    char *p = abi::__cxa_demangle(typeid(T).name(), 0, 0, 0);
    std::string r(p);
    free(p);
    return(r);
  }
};

#include <boost/mpl/apply.hpp>
#include <iostream>

int main()
{
  std::cout <<
    type_info2<boost::mpl::apply<METAFUNCION, int>::type>::name() <<
    std::endl;
  std::cout <<
    type_info2<boost::mpl::apply<METAFUNCION, HELPER<float, double> >::type>::name() <<
    std::endl;
  std::cout <<
    type_info2<boost::mpl::apply<METAFUNCION2, HELPER<float, double> >::type>::name() <<
    std::endl;
  return(0);
}

출력 :

int
double
double

내가 예상했던 것처럼 조금 놀랐습니다.

int
HELPER<float, double>
double

이제 위와 같은 코드는 Microsoft Visual C ++ 2008에서 컴파일되지 않는다는 것을 알고 있습니다 (메시지를 기억하지는 않지만 MetaFunction2 Struct 내부의 구조물을 전문화 할 수없는 선을 따라).

그래서 내 질문은 -이 G ++ 동작이 표준에 부합합니까? 나는 여기에 뭔가 잘못되었다는 강한 느낌이 들지만 100% 확실하지 않습니다.


호기심을 위해 - 나는 metafunction2를 재정의 할 때 예상대로 행동을 가지고있다.

struct METAFUNCION2 : METAFUNCION
{
  template<class T>
  struct apply : METAFUNCION::apply<T>
  {
  };
  template<class T1, class T2>
  struct apply<HELPER<T1, T2> > : METAFUNCION::apply<T2>
  {
  };
};
도움이 되었습니까?

해결책

다음 코드는 불법입니다.

struct METAFUNCION2 : METAFUNCION
{
  template<class T1, class T2>
  struct apply<HELPER<T1, T2> > : METAFUNCION::apply<T2>
  {
  };
};

C ++ 표준에 따르면 14.7.3/3 :

명시 적으로 전문화되는 함수 템플릿 또는 클래스 템플릿의 선언은 명시 적 전문화 선언 시점에서 범위에 있어야합니다.

편집하다: 에 따르면 핵심 이슈 727 이 제한은 회원 템플릿의 부분 전문화에 적용되지 않습니다.

다른 팁

그래서 나는 제출했다 GCC의 버그

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top