簡體   English   中英

為什么我收到錯誤“非模板'f'用作模板”

[英]Why am I getting the error “non-template 'f' used as template”

我試圖了解在哪里使用templatetypename ,我遇到了一個我無法解決的問題。 我有一個模板函數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'類模板

我相信,這個錯誤是不正確的,有其實名為公共模板函數fstruct 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM