我的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 ()(代码片