2013-03-21 48 views
3
prog.cpp:9:13: error: ‘result_type’ does not name a type 
prog.cpp:9:13: note: (perhaps ‘typename std::unary_function<_Arg, _Result>::result_type’ was intended) 

編譯: http://ideone.com/vttG8W不能使用來自的std :: unary_function繼承的typedef

爲什麼我不能直接使用result_type的?

#include <functional> 

using namespace std; 

template <typename ARGUEMENT, typename RESULT> 
class FunctorBase : public std::unary_function<ARGUEMENT, RESULT> 
{ 
public: 
    virtual result_type operator() (argument_type) = 0; 
     FunctorBase() {} 
     virtual ~FunctorBase() {} 
}; 

int main() 
{ 
    FunctorBase<int&, void>(); 
} 

回答

3

因爲它是一個不合格的名稱

當您在類模板中使用非限定名稱時,必須告訴編譯器它不應該在兩階段名稱查找的第一階段中立即搜索全局名稱,而是等到實例化(因爲名稱可能來自基類,就像這裏的情況一樣)。

在這種情況下,你可以這樣做(並result_type一個依賴,限定名):

typedef typename std::unary_function<ARGUEMENT, RESULT>::result_type result_type; 

注意,同樣適用於argument_type

typedef typename std::unary_function<ARGUEMENT, RESULT>::argument_type argument_type; 

武裝與這兩個typedef S,原來的成員函數聲明現在可以編譯:

virtual result_type operator() (argument_type) = 0; 
3

因爲result_typeargument_type依賴於模板參數。用途:

virtual typename std::unary_function<ARGUEMENT, RESULT>::result_type 
    operator() (typename std::unary_function<ARGUEMENT, RESULT>::argument_type) = 0; 

,或者,如果您需要在更多的地方,在你的類的開頭添加

using typename std::unary_function<ARGUEMENT, RESULT>::result_type; 
using typename std::unary_function<ARGUEMENT, RESULT>::argument_type; 

0

你可以在你的類重新的typedef它:

typedef typename std::unary_function<ARGUEMENT, RESULT>::result_type my_result_type; 

(你可以甚至將它重命名爲完全相同的東西) 即使您繼承的是私有的,也可以工作。

compiles

template <typename blah> 
class MyTemplateBaseClass 
{ 
    public: 
    typedef blah my_blah_typedef; 
}; 

template <typename arg> 
class DerivedFromTemplated : private MyTemplateBaseClass<arg> 
{ 
public: 
    //Either giving the full name: 
    typename MyTemplateBaseClass<arg>::my_blah_typedef GetBlahType() 
    { 
     return typename MyTemplateBaseClass<arg>::my_blah_typedef(); 
    } 

    //Or typedef-ing it locally: 
    typedef typename MyTemplateBaseClass<arg>::my_blah_typedef my_blah_typedef; 
    my_blah_typedef GetBlahType2() 
    { 
     return my_blah_typedef(); 
    } 
}; 

int main() 
{ 
    DerivedFromTemplated<int> test; 
} 
+1

第一行寫着'類型定義模板...',而不是'的typedef typename的...'。 – 2013-03-21 16:32:57

+0

哎呀。我沒有測試過的那一行是一個簡單的錯誤。 =) 感謝您指出。 – 2013-03-21 16:37:46