错误:没有参与' at'这取决于模板参数,因此at的声明必须可用

时间:2015-04-01 12:19:10

标签: c++ templates vector compiler-errors std

Noob,

我试图从Bjarne Stroustrup' The C ++ Programming Language'中编译这段代码。但CodeBlocks一直在向我抛出这个错误。

代码是关于检查矢量函数中保存的数组的范围。

以下是代码:

#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;
}

返回的错误是:

  • 没有任何论据可以在&#39;取决于模板参数,因此声明&#39; at&#39;必须可用
  • 注意:(如果您使用&#39; -fpermissive&#39;,G ++将接受您的代码,但不允许使用未声明的名称
  • 在成员函数&#39; const T&amp; operator [](int i)const&#39;:
  • 没有任何论据可以在&#39;取决于模板参数,因此声明&#39; at&#39;必须可用
  • &#39;条目&#39;未在此范围内宣布
  • 模板参数1无效
  • 声明中的无效类型&#39;(&#39;令牌

有人可以向我解释一下吗?

另外,如果我不使用命名空间std,我将如何实现这一点;&#39;

2 个答案:

答案 0 :(得分:22)

at替换为vector<T>::atthis->at

现在,模板中查找函数的规则比最初设计C ++时更加紧凑。

现在,只有this->才会查找依赖库中的方法,否则会假定它是一个全局函数(或一个非依赖的基类/类本地/等)。

这有助于避免在实践中出现令人讨厌的意外,您认为方法调用会成为全局调用,或全局调用成为方法调用。它还允许更早地检查模板方法体。

答案 1 :(得分:5)

除了Yakk的回答,另一个解决方案是添加

using vector<T>::at;

Vec基本上将其添加到查找功能列表中。

这样,at()可以像往常一样使用,而不会在基类类型前加this->