c++ - C++20 中的概念
问题描述
我最近开始用 C++ 编程。我正在尝试学习 c++20 中表示的概念。当我做作业时,我遇到了一个问题。有人能说出为什么这不想编译吗?
它报告:
1.Error C3864 'ns1::BufferedCollection<T>': requires clause is incompatible with the declaration for each function
BufferedCollectionHeader.h
namespace ns1
{
template<typename T>
concept AddableComparable= requires (const T& a,const T& b)
{
{a + b} -> std::convertible_to<T>;
{a < b} -> std::convertible_to<bool>;
};
template<typename T>
concept Printable = requires(std::ostream stream,const T& a)
{
{stream << a} -> std::convertible_to<decltype(stream)>;
};
template<typename T>
concept AddableComparablePrintable = AddableComparable<T> && Printable<T>;
template<typename T>
requires AddableComparablePrintable<T>
class BufferedCollection : public IPrintable
{
static_assert(std::is_copy_assignable<T>::value, "Tip T nije copy_assignable");
static_assert(std::is_move_assignable<T>::value, "Tip T nije move_assignable");
int elements;
int buffers;
int capacity;
template<typename K>
struct Node
{
int capacity;
K* p;
Node<K>* next;
};
Node<T>* list;
public:
BufferedCollection(int)noexcept;
...
};
}
缓冲集合.h
#include "BufferedCollectionHeader"
template<typename T>
requires ns1::AddableComparablePrintable<T>
ns1::BufferedCollection<T>::BufferedCollection(int n)noexcept: elements(0),buffers(0),capacity(n),list(nullptr){};
...
源.cpp
class TestClass:public ns1::IPrintable
{
int x;
public:
friend std::ostream& operator<<(std::ostream& stream, const TestClass& test)
{
stream << test.to_string();
return stream;
}
TestClass(int n):x(n){}
std::string to_string()const noexcept override
{
return std::to_string(x);
}
TestClass operator+(const TestClass& t)const
{
return TestClass(t.x + x);
}
bool operator<(const TestClass& t)const
{
return true;
}
};
int main()
{
ns1::BufferedCollection<TestClass> bc(3);
return 0;
}
笔记:
- IPrintable 是表示可打印对象的抽象类。
- 我在两个文件中分发了 BufferedCollection 类的代码,因为它在分配中是必需的
解决方案
您不应该按价值获取流。它们是不可复制的。
friend std::ostream& operator<<(std::ostream& stream, const TestClass& test)
你需要 const 限定你的+
and <
,因为约束看起来const T &
TestClass operator+(const TestClass& t) const;
bool operator<(const TestClass& t) const;
旁白:你为什么只 +
为<<
和定义一个概念<
?有什么问题std::three_way_comparable
?
为什么static_assert
可分配性,而不是概念?
推荐阅读
- python - 扩展 openpyxl 工作簿类
- android - 当应用程序处于后台时,在 onMessageReceived 中未收到 Firebase 通知
- r - 将小时数(未格式化)更改为 R 中的 hh:mm 时输出错误
- javascript - HTML 按钮在桌面上可以正常工作 在移动设备上不能正常工作
- email - 为什么相同的内容根据邮件客户端的不同解码?
- ffmpeg - FFMPEG 通过直接复制降低实时 h264 流的 fps
- php - 如何将非 www url 重定向为 www。进入 htaccess
- python-3.x - 表单不验证。包含 csrf_token
- r - 从 R 中的所有列中检测 Dataframe 中的重复项
- python - 如何获取python字典中键的值