2012-10-18 118 views
4

我想了解在哪裏使用templatetypename,我遇到了一個我無法解決的問題。我有一個模板函數f<T>,它使用傳遞給它的類型(它將是一個類)來調用模板成員函數.f<T>。我想我的函數體中使用的typename是正確的,不過,我不斷收到以下錯誤:爲什麼我得到錯誤「非模板」f用作模板「

source.cpp: In function 'void f()' :
source.cpp:11:19: error: non-template 'f' used as template
source.cpp:11:19: note: use 'typename T::C::template f' to indicate that it is a template

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>(); 
// ... 

我照它說,後來我收到錯誤的下一行:

error: no class template named 'f' in 'struct A::C'

我認爲這個錯誤是在有是不正確實際上是一個名爲f的公共模板函數struct A::C。我在這裏做錯了什麼?

回答

3

假設我們做fstatic因此它可以在沒有實例調用,你不需要typename,因爲你不依賴型創建任何含糊之處(即,因爲你使用它C不能是一個變量之後)。下面是正確的語法:

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>(); 
} 
+0

如果我們拿走了'static',會是什麼我們必須這樣做才能調用'f'? –

+0

所以你的意思是'T :: C->模板f ();'? –

+0

@ user6607我更新了答案,閱讀。 –

相關問題