error: tidak ada argumen 'at' yang bergantung pada parameter template, jadi deklarasi at harus tersedia

Noob di sini,

Saya mencoba mengkompilasi segmen kode ini dari 'Bahasa Pemrograman C++' Bjarne Stroustrup tetapi CodeBlocks terus memberi saya kesalahan ini.

Kode ini tentang pemeriksaan rentang array yang disimpan dalam fungsi vektor.

Ini kodenya:

#include <iostream>
#include <vector>
#include <array>

using namespace std;

int i = 1000;

template<class T> class Vec : public vector<T>
{
public:
    Vec() : vector<T>() { }

    T& operator[] (int i) {return at(i); }
    const T& operator[] (int i) const {return at(i); }
    //The at() operation is a vector subscript operation 
    //that throws an exception of type out_of_range
    //if its argument is out of the vector's range.
};

Vec<Entry> phone_book(1000);

int main()
{

    return 0;
}

Kesalahan yang dikembalikan adalah:

  • tidak ada argumen 'at' yang bergantung pada parameter templat, jadi deklarasi 'at' harus tersedia
  • catatan: (jika Anda menggunakan '-fpermissive', G++ akan menerima kode Anda, tetapi mengizinkan penggunaan nama yang tidak dideklarasikan tidak digunakan lagi
  • Dalam fungsi anggota 'const T& operator[] (int i) const':
  • tidak ada argumen 'at' yang bergantung pada parameter templat, jadi deklarasi 'at' harus tersedia
  • 'Entri' tidak dideklarasikan dalam cakupan ini
  • argumen templat 1 tidak valid
  • ketik deklarasi sebelum token '(' tidak valid

Bisakah seseorang menjelaskan hal ini kepada saya?

Juga, bagaimana saya menerapkan ini jika saya tidak menggunakan 'using namespace std;'


person Bernardo Pliego-Garcia    schedule 01.04.2015    source sumber
comment
Saat mewarisi dari wadah stl, Anda harus menyadari bahwa wadah tersebut tidak memiliki destruktor virtual. Hal ini mungkin menimbulkan masalah ketika subkelas Anda memperoleh sumber daya yang seharusnya dibebaskan di destruktornya.   -  person 463035818_is_not_a_number    schedule 01.04.2015
comment
Pertanyaan terakhir sepele: tulis std:: di depan setiap nama yang berasal dari namespace std, mis. tulis std::vector di mana saja, ATAU tulis using std::vector sekali (Daripada namespace, cukup cantumkan semua nama yang Anda gunakan)   -  person MSalters    schedule 01.04.2015


Jawaban (2)


Ganti at dengan vector<T>::at atau this->at.

Aturan tentang bagaimana fungsi dicari dalam templat sekarang lebih ketat dibandingkan saat C++ pertama kali dirancang.

Sekarang, metode dalam basis dependen hanya dicari jika Anda this->, jika tidak, metode tersebut dianggap sebagai fungsi global (atau basis/kelas lokal/dll yang tidak bergantung).

Hal ini dapat membantu menghindari kejutan buruk dalam praktiknya, ketika apa yang Anda anggap sebagai pemanggilan metode menjadi pemanggilan metode global, atau panggilan global menjadi pemanggilan metode. Hal ini juga memungkinkan pemeriksaan lebih awal terhadap badan metode templat.

person Yakk - Adam Nevraumont    schedule 01.04.2015

Selain jawaban Yakk, solusi lain adalah menambahkan

using vector<T>::at;

ke Vec pada dasarnya menambahkannya ke daftar fungsi yang dicari.

Dengan cara ini, at() dapat digunakan seperti biasa tanpa mengawalinya dengan tipe kelas dasar atau this->.

person noma    schedule 08.03.2017