2012-02-03 89 views
4
#include <type_traits> 
using namespace std; 

struct asd{ 
    void f(); 
}; 

int f(); 

typedef typename result_of<decltype(f)>::type result_free; 
typedef typename result_of<decltype(&asd::f)>::type result_mem; 

兩個類型定義給出錯誤的result_of不工作對我來說

In file included from ../main.cpp:1:0: 
/usr/include/c++/4.6/type_traits: In instantiation of ‘std::_Result_of_impl<false, false, int>’: 
/usr/include/c++/4.6/type_traits:1215:12: instantiated from ‘std::result_of<int()>’ 
../main.cpp:10:41: instantiated from here 
/usr/include/c++/4.6/type_traits:1192:9: error: ‘std::declval [with _Tp = int, typename std::add_rvalue_reference<_Tp>::type = int&&]()’ cannot be used as a function 
../main.cpp:10:43: error: invalid combination of multiple type-specifiers 
../main.cpp:10:59: error: invalid type in declaration before ‘;’ token 
../main.cpp:11:49: error: ‘type’ in ‘struct std::result_of<void (asd::*)()>’ does not name a type 
../main.cpp:11:64: error: invalid type in declaration before ‘;’ token 

回答

6

的result_of爲result_of<Fn(ArgTypes...)>,不只是result_of<Fn>;

嘗試

typedef typename result_of<decltype(&f)()>::type result_free; 
typedef typename result_of<decltype(&asd::f)(asd)>::type result_mem; 

+0

爲什麼不這段代碼編譯,甚至(用gcc 4.6.2工作),如果我追加一個'()'引起在該行的'T'後錯誤? http://ideone.com/pVbBz我迷路了,我認爲'decltype(&f)'的目的是獲得「變量」f的類型,如果我有一個模板參數而不是'decltype'它應該沒問題... – 2012-02-03 17:31:03

+0

@LorenzoPistone這個例子有兩個明顯的錯誤:試圖使用'result_of ',它不存在,並且取得'main'的地址。至於沒有使用「函數返回函數」,如果你的結果是'result_of ',其中T是函數類型,那麼這是一個很好的問題。 – Cubbi 2012-02-03 18:52:26

+0

@LorenzoPistone從不知道,只是result_of不採用函數類型,其中'T'就是你的情況。引用標準時,'Fn應該是可調用類型,對函數的引用或對可調用類型的引用。如果你'std :: add_lvalue_reference'並且不要忘記括號,它就會起作用。 – Cubbi 2012-02-03 18:59:04

相關問題