سؤال

Noob هنا لا تزال تجريب القوالب. محاولة كتابة قالب فئة معالجة الرسائل

template <typename T> class MessageProcessor {

  //constructor, destructor defined
  //Code using t_ and other functions
foo( void ) {

//More code in a perfectly fine method
}
  private:  T *t_

};

جميع المعرفة في ملف الرأس. لقد بنيت واختبرت صفي وكل شيء على ما يرام. الآن، أحاول القيام بذلك:

template <typename T> class MessageProcesor {

  //Same stuff as before

foo(void) {
//Same code as before in foo, but one new line:
  t_->getMessageSender<MessageType>();

}

private: T *t_;
};

ومع ذلك، يعطيني هذا الخط خطأ من نوع التعبير السيئ قبل الرمز ">".

لقد أضفت ملفات الرأس اللازمة لتحديد ما هو MessageType. لقد استخدمت هذه الوظيفة وقتا كبيرا من قبل، فقط ليس في هذا السياق.

أظن أن المترجم لا يحب حقيقة أن وظيفة القالب محددة بالكامل (متخصصة؟) ضمن قالب فئة غير محددة (غير متقلب؟). أنا لست grokking تماما ما الذي يجعل القالب "متخصص". معظم التفسيرات مركز على مفاهيم "كامل" أو "جزئي"، ولكن ليس ما يجعلها متخصصة في المقام الأول.

الاعتذار إذا كنت ترغب في رؤية المزيد من التعليمات البرمجية. ليس لدي أي الوصول إلى الإنترنت في العمل وهذا هو المكان الذي أقوم بهذا حيث أفعل هذا، لذلك يجب علي وضع كل شيء في "ScratchPad" الذهني وإحضاره إلى المنزل.

هل كانت مفيدة؟

المحلول

يحتاج وظيفة العضو "FOO" إلى نوع الإرجاع وتحتاج إلى استخدام الكلمة الأساسية "قالب" عند استخدام قوالب الأعضاء في التعبيرات المعالين (التعبيرات التي تعتمد معانيها بشكل مباشر أو غير مباشر على معلمة قالب عامة)

t_->template getMessageSender<MessageType>();  // ok
t_->getMessageSender<MessageType>(); // not ok

ربما يساعدك هذا المثال في تقديره عند قالب الأعضاء الاحتياجات ليتم استبدالها بواسطة الكلمة الأساسية "القالب" [ملاحظة: في مصلحة التناظر، قد تستخدم دائما بادئة "القالب" على قوالب الأعضاء، ولكنها اختيارية عند استخدامها في تعبير غير معتمد.

struct MyType
{  
  template<class T> void foo() { }
};

template<class U>
struct S
{
  template<class T>
  void bar()
  {
    MyType mt;  // non-dependent on any template parameter
    mt.template foo<int>(); // ok
    mt.foo<int>();  // also ok

    // 't' is dependent on template parameter T
    T t;
    t.template foo<int>();    // ok
    t.foo<int>(); // not ok

    S<T> st; // 'st' is dependent on template parameter T
    st.template foo<int>();    // ok
    st.foo<int>(); // not ok


    S<MyType> s;  // non-dependent on any template parameter
    s.bar<int>(); // ok
    s.template bar<int>(); // also ok

  }

};

امل ان يساعد.

نصائح أخرى

أضف الكلمة الرئيسية template ما بين -> واسم طريقة القالب:

t_->template getMessageSender<MessageType>();

من المرجح أن MessageType غير معروف في تلك المرحلة. هل تفتقد أن تشمل أو قرار مساحة الاسم أو إعلان؟

إذا كنت لا، كيف getMessageSender أعلن، وكيف MessageType?

بشكل عام، في C ++ أنها ليست مشكلة إذا لم تكن معروفة في تلك المرحلة (حسنا ... إنها معقدة، ولكنها لا تزال).

أيضا، تحتوي رسالة الخطأ عادة على النوع الذي حاول أن يتم إثباته. حاول نشر رسالة الخطأ الكاملة على الأقل.

هل لديك مكالمات أخرى مماثلة لطرق مثل GetMessagesender التي يتم تجميلها؟

t_->getMessageSender<MessageType>();

انها مجرد نوع العودة لوظيفتك مفقودة. ال t_ عضو محدد بالكامل.

تخصص القالب هو إصدار "خاص" تطبيقك لحجج قوالب محددة. مثال: std::vector هي النسخة المتخصصة العامة std::vector.

التخصص الجزئي هو تنفيذ رمز عام الخاص بك حيث لا يتم توفير جميع حجج القوالب.

هذا يعمل بشكل جيد على مترجم Visual Studio 2010.

class One
{
public:
    void newFoo() ;
    template < class T > void foo()
    {
        T obj ;  // obj is dependent on template parameter
        obj.newFoo() ;  // and this works
    }
}

فقط للحفاظ على تحديث الإجابة!

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