考慮以下,最小的例子,當不編譯(編譯沒有#1
和#2
):C++模板通過函數簽名
void foo(void)
{ }
template<typename T> class Stage2;
template<typename Ret, typename... Args>
struct Stage2<Ret (Args...)>
{
template<Ret (*func)(Args...)>
static void foobar(void)
{ /* Do something */ }
};
template<typename FuncType>
struct Stage1
{
template<FuncType func>
static void bar(void)
{
Stage2<FuncType>::foobar<func>(); // #1, Not working
Stage2<decltype(func)>::foobar<func>(); // #2, Not working
Stage2<void()>::foobar<func>(); // #3, Working
}
};
int main(void)
{
Stage1<decltype(foo)>::bar<foo>();
return 0;
}
爲何不與#1
和#2
編譯,而它編譯只是#3
罰款?在我看來,只要foo的簽名爲void()
,#3
應該與其他人相同,在本例中它就是這樣做的。即使編譯器告訴我,FuncType
實際上是void()
(見下文)。
錯誤信息(同爲#1
和#2
):
main.cpp: In static member function ‘static void Stage1<FuncType>::bar()’:
main.cpp:21:40: error: expected primary-expression before ‘)’ token
Stage2<FuncType>::foobar<func>(); // #1, Not working
^
main.cpp: In instantiation of ‘static void Stage1<FuncType>::bar() [with FuncType func = foo; FuncType = void()]’:
main.cpp:29:37: required from here
main.cpp:21:33: error: invalid operands of types ‘<unresolved overloaded function type>’ and ‘void (*)()’ to binary ‘operator<’
Stage2<FuncType>::foobar<func>(); // #1, Not working
~~~~~~~~~~~~~~~~~~~~~~~~^~~~~
缺少什麼我在這裏?我正在使用g ++ 7.2.0。
注意:如果這樣做有用,我不會真正感興趣,我只想知道它爲什麼不編譯,因爲它對我沒有意義。
從來沒有聽說過這種語法,很高興知道。謝謝! – Shadowigor