جزئية التخصص من فئة القالب في فئة مشتقة يؤثر على قاعدة الطبقة

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

سؤال

لدي metafunction:

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

ثم تحديد المساعد:

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

ثم لدي الثانية metafunction التي تستمد من METAFUNCTION أعلاه يحدد جزئية التخصص من تطبيق البنية:

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 البنية).

لذا سؤالي هو هل هذه g++ السلوك conformant مع المعيار ؟ لدي شعور قوي بأن هناك شيء خاطئ هنا ولكن أنا لست متأكدا 100٪.


غريبة - لدي behaviuor كما كنت أتوقع عندما كنت إعادة تعريف 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 لا ينطبق هذا التقييد الجزئي التخصصات من الأعضاء قوالب.

نصائح أخرى

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top