首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++20中的概念

C++20中的概念
EN

Stack Overflow用户
提问于 2021-01-13 10:39:38
回答 2查看 269关注 0票数 1

我最近开始用c++编程。我正在努力学习用c++20表示的概念。当我完成我的使命时,我遇到了一个交叉的问题。有人能说出为什么不想编译吗?

它报告说:

代码语言:javascript
复制
1.Error C3864 'ns1::BufferedCollection<T>': requires clause is incompatible with the declaration for each function  

BufferedCollectionHeader.h

代码语言:javascript
复制
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;
        ...
    };
}

BufferedCollection.h

代码语言:javascript
复制
#include "BufferedCollectionHeader"
template<typename T>
requires ns1::AddableComparablePrintable<T>
ns1::BufferedCollection<T>::BufferedCollection(int n)noexcept: elements(0),buffers(0),capacity(n),list(nullptr){};
...

Source.cpp

代码语言:javascript
复制
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的代码,因为它是赋值所必需的
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-01-13 11:12:51

concept Printable = requires(std::ostream stream,const T& a)应该将引用作为输入(在朋友定义中也是如此):

代码语言:javascript
复制
    template<typename T>
    concept Printable = requires(std::ostream &stream,const T& a)
                                              ^~~~~~~                                              
    {
        {stream << a} -> std::convertible_to<decltype(stream)>;
    };

除此之外,TestClass的加法和比较运算符应该被标记为const。如果您改变了这一点,它就编译得很好:现场演示。我进一步简化了您的示例,并将其放入一个文件中。因此,我不确定这是否解决了你所有的问题。

更新

从这个比较中可以看出,GCC和clang编译,但是MSVC仍然拒绝代码。

票数 0
EN

Stack Overflow用户

发布于 2021-01-13 11:12:37

你不应该以价值来获取溪流。它们是不可复制的。

代码语言:javascript
复制
friend std::ostream& operator<<(std::ostream& stream, const TestClass& test)

您需要限定您的+<,因为约束查看const T &

代码语言:javascript
复制
TestClass operator+(const TestClass& t) const;
bool operator<(const TestClass& t) const;

旁白:为什么您只为+<<<定义了一个概念?std::three_way_comparable怎么了?

为什么static_assert是可分配的,而不是概念?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65700218

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档