自定义类没有可行的重载运算符 []

Posted

技术标签:

【中文标题】自定义类没有可行的重载运算符 []【英文标题】:No viable overloaded operator[] for custom class 【发布时间】:2016-02-15 18:13:55 【问题描述】:

我已经编写了 std::vector 的自定义子类:

template <class T>
class CustVec : public vector<vector<T>> 

public:

    T& operator [](const pair<int, int> pos) 
        return (*this)[pos.first][pos.second];
    
;

但是我遇到了错误No viable overloaded operator[] for type 'CustVec&lt;pair&lt;int, int&gt;&gt;'"。如何解决?

【问题讨论】:

你用什么编译器? 不要从标准容器继承。而是使用合成。 问题是(*this)[pos.first]看起来像递归调用,但参数错误。 @Valentin,Xcode 7.1,但问题也出现在其他编译器上。 【参考方案1】:

您通过声明一个新的运算符来隐藏基类operator[]。像往常一样,这会在外部范围内隐藏相似的名称。

您可以通过显式导入名称使其再次可见

using vector<vector<T>>::operator[];

也许把它放在私有部分,以便不使其公开访问

template <class T>
class CustVec : public vector<vector<T>> 

    using vector<vector<T>>::operator[];

public:

    T& operator [](const pair<int, int> pos) 
        return (*this)[pos.first][pos.second];
    
;

【讨论】:

以上是关于自定义类没有可行的重载运算符 []的主要内容,如果未能解决你的问题,请参考以下文章

类型匹配没有可行的重载运算符

运算符重载

重载运算符

重载运算符问题

使用标记调度存在自定义 CUDA 分配器时重载类新运算符

c++中加号运算符重载