我有一个模板类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];
}
编译时,我收到以下错误:
我读过的所有内容都说这应该有效。唯一的区别是我正在使用模板类。我错过了一些明显的东西吗?
答案 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类的细节。
感谢您的帮助。你的答案能够激励我为我的班级找到一个更好的方向。