Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapa pengkompil gagal untuk menyusun apabila menggunakan fungsi ahli templat dalam fungsi templat?

Mengapa pengkompil gagal untuk menyusun apabila menggunakan fungsi ahli templat dalam fungsi templat?

Patricia Arquette
Patricia Arquetteasal
2024-11-02 16:08:29763semak imbas

Why does the compiler fail to compile when invoking a template member function within a template function?

Invokasi Fungsi Ahli Templat dalam Fungsi Templat

Coretan kod yang disediakan menunjukkan ralat yang dihadapi semasa menggunakan fungsi ahli templat dari dalam fungsi templat :

<code class="cpp">template<class X> struct A {
   template<int I> void f() {}
};

template<class T> void g()
{
   A<T> a;
   a.f<3>();  // Compilation fails here
}</code>

Pengkompil gagal untuk menyusun kod ini, melaporkan ralat berkaitan kepada penggunaan ahli yang tidak sah dan mencadangkan bahawa '&' mungkin telah dilupakan.

Penjelasan

Ralat berlaku kerana kod cuba menggunakan templat ahli tanpa secara eksplisit menyatakan kata kunci 'template' sebelum itu. Menurut C Standard (14.2/4), apabila nama pengkhususan templat ahli digunakan selepas titik atau anak panah dalam ungkapan postfix, atau selepas penentu nama bersarang dalam id yang layak dan ungkapan postfix atau qualified-id secara eksplisit bergantung pada parameter template, nama template ahli mesti diawali dengan kata kunci 'template.' Jika tidak, nama itu akan diandaikan merujuk kepada bukan templat.

Penyelesaian

Untuk menyelesaikan isu ini, kod mesti diubah suai untuk menyatakan secara eksplisit 'templat ' kata kunci sebelum nama templat ahli:

<code class="cpp">template<class T> void g()
{
   A<T> a;
   a.template f<3>();  // add 'template' keyword here
}</code>

Dengan pengubahsuaian ini, pengkompil akan dapat mengenal pasti dengan betul dan gunakan fungsi templat ahli, dan kod akan berjaya disusun.

Atas ialah kandungan terperinci Mengapa pengkompil gagal untuk menyusun apabila menggunakan fungsi ahli templat dalam fungsi templat?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn