错误:没有用于调用sort的匹配函数

时间:2015-08-22 05:05:28

标签: c++ arrays

来自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()。

1 个答案:

答案 0 :(得分:1)

您要求使用begin()end()是有问题的。排序需要随机访问迭代器;请参阅Bjarne Stroustrup The C++ programming language 4th editionstd::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&)排序的字符串。