2016-02-09 7 views
7

वहाँ किसी भी तरह से मैं जीसीसी 4.9 में त्रुटि संदेश मिल रहा, जैसा कि नीचे (online version) से पता चला एक वर्ग टेम्पलेट Foo की functor operator()(int) कॉल करने के लिएएक वर्ग टेम्पलेट में एक टेम्प्लेटेड functor कॉलिंग

template<typename T> 
struct Foo 
{ 
    template<typename U> 
    void operator()(int) 
    { 
    } 
}; 

int main(int argc, char *argv[]) 
{ 
    Foo<char> foo; 
    foo<bool>(42); 
} 

है। 3

error: expected primary-expression before ‘bool’ 
    foo<bool>(42); 

मैं template साथ functor पहले जोड़ें हैं तो सदस्य समारोह एक functor नहीं था और ::, ., या -> उपसर्ग के साथ किया गया था। कुछ मदद के बिना संकलक इस अभिव्यक्ति को पार्स करने के बारे में नहीं जानता था; foo<int> प्रकार के अज्ञात ऑब्जेक्ट के फ़ैक्टर या तत्काल के रूप में।

उत्तर

5

यह काम करेगा;

foo.operator()<bool>(42); 

ऑपरेटर समर्पित टेम्पलेट तर्क प्रकारों के साथ सर्वश्रेष्ठ खेलते हैं।

आप जिस संदर्भ में उपयोग कर सकते हैं, उस संदर्भ के बारे में पर्याप्त विवरण नहीं देते हैं;

  • कॉल ऑपरेटर एक सदस्य समारोह बनाने और इस तरह की अनुमति देने के स्पष्ट टेम्पलेट प्रकार तर्क
  • एक टैग प्रेषण तंत्र
  • एक तर्क

उदाहरण के लिए के रूप में प्रकार U स्वीकार

template<typename U> 
void operator()(int, U&& /*initial*/) 
{ 
    // use the initial value of U 
} 
// called as... 

foo(42, true); // U is bool in your example 

या बस सदस्य कार्य;

template<typename U> 
void my_func(int) 
{ 
} 
// called as... 

foo.my_fun<bool>(42); 
+0

"ऑपरेटरों को समर्पित टेम्पलेट तर्क प्रकारों के साथ सर्वश्रेष्ठ खेलें" - याद रखने योग्य। मैंने '&&' छोड़ा था। – Olumide

+0

@ ओलुमाइड। 'U && 'तर्क का उपयोग केवल इस विचार के साथ किया जाता है कि यदि प्रकार अधिक जटिल था, तो एक आदिम,' std :: move' का उपयोग किया जा सकता था या 'U &&' अस्थायी रूप से भी बाध्य हो सकता है। एक सरल 'यू' भी ठीक काम करेगा। – Niall

5

हाँ लेकिन यह बदसूरत है:

foo.operator()<bool>(42); 
3

दुर्भाग्य से आप इस के लिए foo.operator()<bool>(42); उपयोग करने की आवश्यकता होगी। foo<bool> सी ++ 14 परिवर्तनीय टेम्पलेट्स जैसी चीजों के लिए मान्य है, टेम्पलेट कॉल ऑपरेटर नहीं।

क्या तुम कर सकते हो प्रकार का टैग है और वह पास कॉल ऑपरेटर के लिए एक तर्क सही प्रकार निकालना के रूप में:

//tag 
template <typename T> 
struct type{}; 

template<typename T> 
struct Foo 
{ 
    template<typename U> 
    //deduction on the tagged type 
    void operator()(type<U>, int) 
    { 
    } 
}; 

int main(int argc, char *argv[]) 
{ 
    Foo<char> foo; 
    foo(type<bool>{}, 42); 
    // ^^^^^^^^^^^^ pass tag 
} 

आप सी ++ 14 चर टेम्पलेट का उपयोग कर अच्छे थोड़ा इस बना सकता है टैग के लिए:

template <typename T> 
struct type_t{}; 

//variable template for nicer usage 
template <typename T> 
type_t<T> type; 

template<typename T> 
struct Foo 
{ 
    template<typename U> 
    void operator()(type_t<U>, int) 
    { 
    } 
}; 

int main(int argc, char *argv[]) 
{ 
    Foo<char> foo; 
    foo(type<bool>, 42); 
    //don't need {}^ 
} 
संबंधित मुद्दे