来自Matthew H. Austern的STL书籍,“Block”类用于固定大小的数组。
template<class T, size_t N>
struct Block
{
// Various typedef's
// Implementations of begin() and end().
reference operator[](size_t nIndex)
{
return data[nIndex];
}
// I added this overloaded operator+
T* operator+(const size_t nIncrement)
{
return (data + nIncrement);
}
// I added this overloaded cast operator
// **Why is this cast operator not being called?**
operator T*()
{
return data;
}
T data[N];
};
这就是我想要做的事情:
Block<int, 10> tArray; // Populate tArray.
// I want to use std::sort() in the same way as I would
// for a regular array.
sort(tArray, tArray + tArray.size());
我收到编译错误:
错误:没有用于调用sort的匹配函数(Block&amp;,int *)
为什么编译器不知道重载的强制转换运算符?
以下所有编译:
sort(tArray + 0, tArray + tArray.size());
sort(static_cast<int*>(tArray), tArray + tArray.size());
sort(tArray.begin(), tArray.end());
显然,有一些关于如何重载的强制转换操作符 我不知道的工作。有什么想法吗?
感谢。
约束:
我可能不会使用C ++ 11(所以没有来自C ++ 11的std :: array)。 我可能不会使用begin()和end()。
答案 0 :(得分:1)
您要求使用begin()
或end()
是有问题的。排序需要随机访问迭代器;请参阅Bjarne Stroustrup The C++ programming language 4th edition和std::sort
。
使用显式的强制转换和指针artithmic,您应该能够执行以下操作:
例如,让 T
为std::string
,让 N
为42,让 {{1} } 初始化b
:
Block<T,N>
现在 Block<std::string, 42> b;
std::string* begin = (std::string*)b;
std::string* end = begin + 42; // Or if Block has Block.size()
// std::string* end = begin + b.size()
std::sort(begin, end);
包含根据bool operator<(const std::string&, const std::string&)
排序的字符串。