#ifndef __TEST__
#define __TEST__
namespace std
{
template<typename T>
class list;
}
template<typename T>
void Pop(std::list<T> * l)
{
while(!l->empty())
l->pop();
}
#endif
dan menggunakan fungsi itu di main saya. Saya mendapatkan kesalahan. Tentu saja, saya tahu bahwa ada lebih banyak params template untuk std::list
(pengalokasi saya pikir). Tapi, itu intinya. Apakah saya harus mengetahui deklarasi templat lengkap dari kelas templat untuk dapat meneruskannya mendeklarasikannya?
EDIT: Saya tidak menggunakan pointer sebelumnya - itu adalah referensi. Saya akan mencobanya dengan pointer.
std::allocator<T>
__TEST__
adalah pengidentifikasi yang dilindungi undang-undang, jangan gunakan itu .Jawaban:
Masalahnya bukan bahwa Anda tidak dapat meneruskan-mendeklarasikan kelas templat. Ya, Anda perlu mengetahui semua parameter template dan default-nya untuk dapat meneruskannya dengan benar:
Tetapi untuk membuat bahkan deklarasi maju semacam
namespace std
itu secara eksplisit dilarang oleh standar: satu - satunya hal yang Anda boleh masukkanstd
adalah spesialisasi templat , biasanyastd::less
pada tipe yang ditentukan pengguna. Orang lain dapat mengutip teks yang relevan jika perlu.Hanya
#include <list>
dan jangan khawatir tentang itu.Oh, kebetulan, nama apa pun yang berisi garisbawah ganda dicadangkan untuk digunakan oleh implementasi, jadi Anda harus menggunakan sesuatu seperti
TEST_H
sebagai ganti__TEST__
. Itu tidak akan menghasilkan peringatan atau kesalahan, tetapi jika program Anda memiliki bentrokan dengan pengidentifikasi yang ditentukan implementasi, maka itu tidak dijamin untuk dikompilasi atau dijalankan dengan benar: itu salah bentuk . Juga dilarang adalah nama yang dimulai dengan garis bawah diikuti dengan huruf kapital, antara lain. Secara umum, jangan memulai sesuatu dengan menggarisbawahi kecuali Anda tahu sihir apa yang Anda hadapi.sumber
namespace std
btw?#pragma once
daripada # ifdef. Ini didukung oleh sebagian besar kompiler hari ini.#pragma
, itu sebabnya. Padahal itu pilihan.Saya memecahkan masalah itu.
Saya menerapkan Lapisan OSI (jendela geser, Level 2) untuk simulasi jaringan di C ++ (Eclipse Juno). Saya punya bingkai (templat
<class T>
) dan statusnya (pola negara, pernyataan maju).Solusinya adalah sebagai berikut:
Dalam
*.cpp
file tersebut, Anda harus menyertakan file Header yang Anda teruskan, yaituItu cpp:
Dan ... kelas lain.
sumber
using namespace
di file header adalah praktik yang sangat buruk karena mencegah siapa pun yang menggunakan file header itu tidak dapat menggunakan nama lokal yang seharusnya valid. Ini pada dasarnya mengalahkan seluruh titik ruang nama.Deklarasi maju harus memiliki daftar argumen templat lengkap yang ditentukan.
sumber
ada alternatif terbatas yang bisa Anda gunakan
tajuk:
cpp:
tidak diuji dalam program nyata, jadi harap itu tidak sempurna.
sumber