模板类无法重新定义运算符[]

got*_*ch4 0 c++ templates operator-overloading

我上过这堂课

namespace baseUtils {

template<typename AT>
class growVector {

        int size;
        AT **arr;
        AT* defaultVal;

    public:

        growVector(int size, AT* defaultVal );   //Expects number of elements (5) and default value (NULL)
        AT*& operator[](unsigned pos);
        int length();
        void reset(int pos);    //Resets an element to default value
        void reset();           //Resets all elements to default value
        ~growVector();
};

}
Run Code Online (Sandbox Code Playgroud)

这是operator []的实现

template<typename AT>
AT*& growVector<AT>::operator [](unsigned pos){
    if (pos >= size){
        int newSize = size*2;
        AT** newArr = new AT*[newSize];
        memcpy(newArr, arr, sizeof(AT)*size);
        for (int i = size; i<newSize; i++)
            newArr[i] = defaultVal;
        size = newSize;
        delete arr;
        arr = newArr;
    }
    return arr[pos];
}
Run Code Online (Sandbox Code Playgroud)

(是的,我确实认识到我不检查大小*2> = pos ...但现在不是重点)如果我在代码中使用它:

int main() {

    growVector<char> gv();
    char* x = NULL;
    for (int i = 0; i< 50; i++){
        gv[i] = x;
    }
    gv.reset();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

编译说

../src/base.cpp:98: warning: pointer to a function used in arithmetic
../src/base.cpp:98: error: assignment of read-only location ‘*(gv + ((unsigned int)i))’
../src/base.cpp:98: error: cannot convert ‘char*’ to ‘baseUtils::growVector<char>()’ in assignment
Run Code Online (Sandbox Code Playgroud)

指的是行gv [i] = x; (似乎没有看到[]的重新定义)

为什么????我错过了什么?


在纠正了构造函数问题后,我的链接器说:

/home/dario/workspace/base/Debug/../src/base.cpp:95: undefined reference to `baseUtils::growVector<char>::growVector(int, char*)'
/home/dario/workspace/base/Debug/../src/base.cpp:98: undefined reference to `baseUtils::growVector<char>::operator[](unsigned int)'
/home/dario/workspace/base/Debug/../src/base.cpp:100: undefined reference to `baseUtils::growVector<char>::reset()'
/home/dario/workspace/base/Debug/../src/base.cpp:101: undefined reference to `baseUtils::growVector<char>::~growVector()'
/home/dario/workspace/base/Debug/../src/base.cpp:101: undefined reference to `baseUtils::growVector<char>::~growVector()'
Run Code Online (Sandbox Code Playgroud)

喜欢它不能链接...为什么??? :o

Mik*_*our 9

问题是你的声明

growVector<char> gv();
Run Code Online (Sandbox Code Playgroud)

编译器将此解释为声明一个被调用的函数gv,该函数返回a growVector<char>,而不是作为您的indend对象.由于没有默认构造函数,因此无论如何都不会编译.将其更改为:

growVector<char> gv(0,0);
Run Code Online (Sandbox Code Playgroud)

  • 大声笑我真的没有看到它......对不起多么可惜...... XD (2认同)