我的C/C++语言学习进阶之旅解决使用algorithm库里面的sort函数的时候,编译报错:未能使函数模板“unknown-type std::less<void>::operator ()(代码片
Posted 欧阳鹏
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我的C/C++语言学习进阶之旅解决使用algorithm库里面的sort函数的时候,编译报错:未能使函数模板“unknown-type std::less<void>::operator ()(代码片相关的知识,希望对你有一定的参考价值。
一、问题描述
定义了一个struct结构体如下所示:
struct Review {
string title;
int rating;
};
测试它
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
struct Review {
string title;
int rating;
};
int main()
{
test_vector3();
}
bool worseThan(const Review& r1, const Review& r2) {
if (r1.rating < r2.rating)
return true;
else
return false;
}
void test_vector3()
{
using std::cin;
using std::cout;
using std::endl;
using std::vector;
vector<Review> books;
Review temp;
while (FillReview(temp))
books.push_back(temp);
if (books.size() > 0) {
cout << "Thank you. You entered the following:\\n"
<< "Rating\\tBook\\n";
// for_each() 函数可用于很多容器类,它接受3个参数
// 前两个是定义容器中区间的迭代器,最后一个是指向函数的指针(更普遍地说,最后一个参数是一个函数对象)
// for_each() 函数将被指向的函数应用于容器区间中的各个元素。被指向的函数不能修改容器元素的值。
// 可用 for_each() 函数来代替for循环,for循环参考示例test_vector2()
for_each(books.begin(), books.end(), ShowReview);
// sort() 函数 也要求容器支持随机访问。该函数有两个版本:
// 第一个版本接受两个定义区间的迭代器参数,并使用为存储在容器中的类型元素定义的 <运算符,对区间中的元素进行操作。
// 如果容器元素是用户定义的对象,则要使用sort(),必须定义能够处理该类型对象的 operator<() 函数。
sort(books.begin(), books.end());
cout << "Sorted by title:\\nRating\\tBook\\n";
for_each(books.begin(), books.end(), ShowReview);
// sort() 函数 也要求容器支持随机访问。该函数有两个版本:
// 第二个版本接受三个参数,前两个参数也是指定区间的迭代器,
// 最后一个是指向函数的指针(更普遍地说,最后一个参数是一个函数对象), 而不是用于比较的 operator<()。
// 返回值可转换成bool, false表示两个参数的顺序不正确。
sort(books.begin(), books.end(), worseThan);
cout << "Sorted by rating:\\nRating\\tBook\\n";
for_each(books.begin(), books.end(), ShowReview);
//random_shuffle() 函数接受两个指定区间的迭代器参数,并随机排列该区间中的元素。
random_shuffle(books.begin(), books.end());
cout << "After shuffling:\\nRating\\tBook\\n";
for_each(books.begin(), books.end(), ShowReview);
}
else
cout << "No entries. ";
cout << "Bye.\\n";
}
编译程序,报错,如下所示:
报了两个错误:
严重性 代码 说明 项目 文件 行 禁止显示状态
错误 C2672 “operator __surrogate_func”: 未找到匹配的重载函数 Demo_C++ C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Community\\VC\\Tools\\MSVC\\14.29.30133\\include\\xutility 1516
严重性 代码 说明 项目 文件 行 禁止显示状态
错误 C2893 未能使函数模板“unknown-type std::less<void>::operator ()(_Ty1 &&,_Ty2 &&) noexcept(<expr>) const”专用化 Demo_C++ C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Community\\VC\\Tools\\MSVC\\14.29.30133\\include\\xutility 1516
二、解决错误
当看到第二个错误未能使函数模板“unknown-type std::less<void>::operator ()(_Ty1 &&,_Ty2 &&) noexcept(<expr>) const”专用化
的时候,我想到了错误原因:
如果容器元素是用户定义的对象,则要使用sort(),必须定义能够处理该类型对象的 operator<() 函数。
因此我们 定义能够处理该类型对象的 operator<() 函数 即可修复该问题。
bool operator<(const Review& r1, const Review& r2) {
if (r1.title < r2.title)
return true;
else if (r1.title == r2.title && r1.rating < r2.rating)
return true;
else
return false;
}
完整代码如下所示:
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
struct Review {
string title;
int rating;
};
int main()
{
test_vector3();
}
// 如果容器元素是用户定义的对象,则要使用sort(),必须定义能够处理该类型对象的 operator<() 函数。
bool operator<(const Review& r1, const Review& r2) {
if (r1.title < r2.title)
return true;
else if (r1.title == r2.title && r1.rating < r2.rating)
return true;
else
return false;
}
bool worseThan(const Review& r1, const Review& r2) {
if (r1.rating < r2.rating)
return true;
else
return false;
}
void test_vector3()
{
using std::cin;
using std::cout;
using std::endl;
using std::vector;
vector<Review> books;
Review temp;
while (FillReview(temp))
books.push_back(temp);
if (books.size() > 0) {
cout << "Thank you. You entered the following:\\n"
<< "Rating\\tBook\\n";
// for_each() 函数可用于很多容器类,它接受3个参数
// 前两个是定义容器中区间的迭代器,最后一个是指向函数的指针(更普遍地说,最后一个参数是一个函数对象)
// for_each() 函数将被指向的函数应用于容器区间中的各个元素。被指向的函数不能修改容器元素的值。
// 可用 for_each() 函数来代替for循环,for循环参考示例test_vector2()
for_each(books.begin(), books.end(), ShowReview);
// sort() 函数 也要求容器支持随机访问。该函数有两个版本:
// 第一个版本接受两个定义区间的迭代器参数,并使用为存储在容器中的类型元素定义的 <运算符,对区间中的元素进行操作。
// 如果容器元素是用户定义的对象,则要使用sort(),必须定义能够处理该类型对象的 operator<() 函数。
sort(books.begin(), books.end());
cout << "Sorted by title:\\nRating\\tBook\\n";
for_each(books.begin(), books.end(), ShowReview);
// sort() 函数 也要求容器支持随机访问。该函数有两个版本:
// 第二个版本接受三个参数,前两个参数也是指定区间的迭代器,
// 最后一个是指向函数的指针(更普遍地说,最后一个参数是一个函数对象), 而不是用于比较的 operator<()。
// 返回值可转换成bool, false表示两个参数的顺序不正确。
sort(books.begin(), books.end(), worseThan);
cout << "Sorted by rating:\\nRating\\tBook\\n";
for_each(books.begin(), books.end(), ShowReview);
//random_shuffle() 函数接受两个指定区间的迭代器参数,并随机排列该区间中的元素。
random_shuffle(books.begin(), books.end());
cout << "After shuffling:\\nRating\\tBook\\n";
for_each(books.begin(), books.end(), ShowReview);
}
else
cout << "No entries. ";
cout << "Bye.\\n";
}
这样就可以正常编译了。
以上是关于我的C/C++语言学习进阶之旅解决使用algorithm库里面的sort函数的时候,编译报错:未能使函数模板“unknown-type std::less<void>::operator ()(代码片的主要内容,如果未能解决你的问题,请参考以下文章
我的C/C++语言学习进阶之旅解决使用ninja命令的时候报错:ninja: error: loading ‘build.ninja‘: 系统找不到指定的文件。
我的C/C++语言学习进阶之旅解决使用ninja命令的时候报错:ninja: error: loading ‘build.ninja‘: 系统找不到指定的文件。
我的C/C++语言学习进阶之旅NDK开发之解决错误:signal 5 (SIGTRAP), code 1 (TRAP_BRKPT), fault addr 0xXXX
我的C/C++语言学习进阶之旅NDK开发之解决错误:signal 5 (SIGTRAP), code 1 (TRAP_BRKPT), fault addr 0xXXX
我的C/C++语言学习进阶之旅解决使用algorithm库里面的sort函数的时候,编译报错:未能使函数模板“unknown-type std::less<void>::operator ()(代码片
我的C/C++语言学习进阶之旅解决使用algorithm库里面的sort函数的时候,编译报错:未能使函数模板“unknown-type std::less<void>::operator ()(代码片