代碼格式不正確:只有幾種方法可以使用成員函數名稱(例如C::Foo
),但這不是其中之一(有效用法的完整列表可以在C++中找到語言標準,參見C++ 11§5.1.1/ 12)。
在您的示例的上下文中,您唯一可以做的是取成員函數的地址&C::Foo
,以形成指向成員函數的指針,類型爲int (C::*)(int)
。
由於代碼格式不正確,編譯器應拒絕它。此外,它取決於如何使用C::Foo
會產生不一致的結果;我們將看看下面的不一致。
請報告Microsoft Connect上的錯誤。或者,讓我知道,我很樂意報告這個問題。
如果你有一個類型,但你不知道是什麼類型,你可以通過在使編譯器發出錯誤的方式使用它找出類型的名稱。例如,聲明一個類模板,從來沒有把它定義:
template <typename T>
struct tell_me_the_type;
後來的後來,你可以實例化這個模板在你感興趣的類型:
tell_me_the_type<decltype(C::Foo)> x;
由於tell_me_the_type
尚未確定,x
的定義無效。編譯器應該在它發出的錯誤中包含類型T
。 VISUAL C++ 2012 RC報道:
error C2079: 'x' uses undefined struct 'tell_me_the_type_name<T>'
with
[
T=int (int)
]
編譯器認爲C::Foo
是int (int)
型。如果是這種情況,那麼編譯器應該接受以下代碼:
template <typename T>
struct is_the_type_right;
template <>
struct is_the_type_right<int(int)> { };
is_the_type_right<decltype(C::Foo)> x;
編譯器不接受此代碼。它報告以下錯誤:
error C2079: 'x' uses undefined struct 'is_the_type_right<T>'
with
[
T=int (int)
]
所以,C::Foo
兩個是int (int)
型的,是int (int)
類型,這違反了principle of noncontradiction的不是。 :-)
當我需要詢問「是什麼類型」時,我使用類似這樣的方式來哄騙編譯器爲我輸出類型'struct {} _ = ;'。通常適用於GCC。 –
2012-07-06 01:54:09