[英]Why am I getting the error “non-template 'f' used as template”
我試圖了解在哪里使用template
和typename
,我遇到了一個我無法解決的問題。 我有一個模板函數f<T>
,它使用傳遞給它的類型(將是一個類)來調用template-member-function .f<T>
。 我認為我在函數體中使用typename
是正確的,但是,我一直收到以下錯誤:
source.cpp:在函數
'void f()'
:
source.cpp:11:19:錯誤:非模板'f'
用作模板
source.cpp:11:19:注意:使用'typename T::C::template f'
來表示它是一個模板
struct A {
struct C {
template <typename T> void f() {}
};
};
template <typename T> void f() {
typename T::C::f<int>();
}
int main() {
f<A>();
}
注意如何在最后一個錯誤上建議使用'typename T::C::template f'
。 所以我按照以下方式做了以下更改:
// ...
typename T::C::template f<int>();
// ...
我按照說法做了,但后來收到了下一行錯誤:
錯誤:
'struct A::C'
沒有名為'f'
類模板
我相信,這個錯誤是不正確的,有其實名為公共模板函數f
在struct A::C
。 我在這里做錯了什么?
假設我們使f
static
因此可以在沒有實例的情況下調用它,因此您不需要使用typename
因為您不會使用依賴類型創建任何歧義(即C
不能是變量,因為您在::
just之后使用它)。 這是正確的語法:
struct A {
struct C {
template <typename T>
static void f() {}
};
};
template <typename T> void f() {
T::C::template f<int>();
}
如果你不想讓它靜態,你可以創建一個A::C
並使用.template f<int>()
:
struct A {
struct C {
template <typename T>
static void f() {}
};
};
template <typename T> void f() {
typename T::C c;
//^^^^^^^^ Now we DO need typename to disambiguate.
c.template f<int>();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.