首页 > 解决方案 > 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;
}

笔记:

标签: c++c++20

解决方案


您不应该按价值获取流。它们是不可复制的。

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可分配性,而不是概念?


推荐阅读