如何在索引运算符的代理上使用赋值运算符

How to use assignment operator on proxy of index operator

在下面的代码中,我制作了一个模板 class,它在主函数中进行了初始化,我正在尝试分配 char*,如下所示,但它不起作用。我认为问题出在我在 Proxy class 中定义的赋值运算符函数中,但我无法弄清楚

#include <iostream>
using namespace std;

template <class T>
class Vector {
 public:
    T *p;

    Vector(int size) {
        p = new T[size];
    }

    class Proxy {
        Vector &a;
        int i;

     public:
        Proxy(Vector &a, int i) : a(a), i(i) {
        }

        void operator=(const T x) {
            a.p[i] = x;
        }
    };

    Proxy operator[](int i) {
        return Proxy(*this, i);
    }
};

int main() {
    Vector<char *> sv1(2);
    sv1[0] = "John";
    sv1[1] = "Doe";
}

我遇到以下错误;

我已经尝试将赋值运算符函数中的参数设置为 const,我还尝试隐式类型转换为 T 没有任何效果

您在编写代码时会遇到同样的错误:

char * whatever = "something";

这段代码至少对于字符串是绝对错误的:

void operator=(const T x)
{
    a.p[i] = x;
}

第一步:分配缓冲区; 第 2 步:将字符串复制到分配的缓冲区。

您的代码适用于 char、int 等原语。以下代码应该有效:

int main() {
    Vector<char> sv1(2);
    sv1[0] = 'J';
    sv1[1] = 'D';
}

试试这个:

using namespace std;

template <class T>
class Vector {
public:
    T* p;
    int sz;

    Vector(int size) {
        p = new T[size];
        sz = size;
    }


    template<class T>
    class Proxy {
        Vector<T>& v;
        int i;
        
    public:
        Proxy(Vector<T>& vec, int index) :v(vec),i(index) { }

        void operator= (const T val) { v.p[i] = val; }
    }; 

    Proxy<T> operator[](int index) { return Proxy<T>(*this, index); }
};

您的代码适用于任何基本类型(intchardouble)和指针,但不适用于以下示例:

int main() {
    Vector<char*> sv1(2);
    sv1[0] = "John";
    sv1[1] = "Doe";
}

首先,Vector 指向一个 char*,而不是字符串文字 (const char*)。您必须使用 C 风格的转换或 const_cast 来转换它。示例:

int main() {
    Vector<char*> sv1(2);
    sv1[0] = const_cast<char*>("John"); //succeeds
    sv1[1] = (char*)"Doe"; //succeeds

    sv1[0] = "John"; //fails
    sv1[1] = "Doe"; //fails
}

在 C++ 中,字符串文字始终是 const char*