2011-04-27 66 views
6

我仍然試圖從MSVC遷移到GCC,但我似乎無法找到解決如下問題:奇怪GCC錯誤:預期前主表達式「」令牌

template < typename A, typename B, typename C, typename D > 
class Test 
{ 
public: 
    Test (B* pObj, C fn, const D& args) : _pObj(pObj), _fn(fn), _args(args) 
    { 
    } 

    A operator()() 
    { 
     return _args.operator() < A, B, C > (_pObj, _fn); // error: expected primary-expression before ',' token 
    } 

    B* _pObj; 
    C _fn; 
    D _args; 
}; 

請幫忙!

回答

19

嘗試return _args.template operator() < A, B, C > (_pObj, _fn);

沒有template關鍵字,解析會有所不同。如果沒有額外使用template,編譯器不知道下面的小於號(<)並不是真的「小於」,而是模板參數列表的開始。

14.2/4

When the name of a member template specialization appears after . or -> in a postfix-expression, or after nested-name-specifier in a qualified-id, and the postfix-expression or qualified-id explicitly depends on a template-parameter (14.6.2), the member template name must be prefixed by the keyword template. Otherwise the name is assumed to name a non-template.

P.S:閱讀本Stackoverflow FAQ Entry

+1

非常感謝您!我知道模板關鍵字,但我從來沒有想過在方法聲明中使用它...現在我明白了,謝謝! – Ryan 2011-04-27 10:25:21

+0

也感謝我,我完全忘記了這一點。這解決了我的一個類似問題! Upvoted。 – DNT 2015-05-29 18:32:51

相關問題