operator []的C ++重载不适用于模板类

时间:2014-03-12 21:57:39

标签: c++ operator-overloading subscript

我有一个模板类Profile,它由std :: vector和我在向量上执行的一些函数组成。我正在尝试使用Profile :: operator []直接访问向量,但是我在编译时遇到错误。

资料

template <class T>
class Profile
{
public:
    vector<T> mElements;

    template <class T>
    T& Profile<T>::operator[] (const int index)
    {
        return mElements[index];
    }

    template <class T>
    unsigned int Profile<T>::size ()
    {
        return mElements.size();
    }

    ...
}

当我尝试在我的代码的另一部分中使用运算符时:

Profile<float> oldProfile;
vector<float> shiftedVector (oldProfile.size(), 0.0);
int shift = 3;

for (i=0 ; i<oldProfile.size() ; ++i)
{
    shift++;

    if (shift > oldProfile.size())
    {
        shift = 0;
    }

    shiftedVector[shift] = oldProfile[i];
}

编译时,我收到以下错误:

  • 无法在分配
  • 中将“个人资料”转换为“浮动”

我读过的所有内容都说这应该有效。唯一的区别是我正在使用模板类。我错过了一些明显的东西吗?

3 个答案:

答案 0 :(得分:3)

我认为你只是这个意思:

template <class T>
class Profile
{
public:
    vector<T> mElements;

    T& operator[](const int index) { return mElements[index]; }

    unsigned int size() { return mElements.size(); }

    // ...
};

答案 1 :(得分:1)

据我所知,您可以通过简单的代码替换所有代码来解决您的整个问题:

template<class... Args> using Profile = std::vector<Args...>;

通过以上行,您将为std::vector模板类创建别名。这样更容易出错并且使用起来更简单。然后,您就可以完全按照代码中的显示使用它。

如果您想要向容器添加功能,我建议您使用迭代器以免费函数实现它:

template<class Iterator>
void your_algorithm(Iterator begin, Iterator end) {
    // do something to the elements
}

这种方法的优点是:

  • 容器独立算法
  • 你不要纠缠容器的界面

答案 2 :(得分:0)

正如我上面提到的,我决定将shift()函数作为Profile类的一部分。这消除了重载operator []的需要,并且更好地封装了Profile类的细节。

感谢您的帮助。你的答案能够激励我为我的班级找到一个更好的方向。