我最近开始用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;
...
};
}BufferedCollection.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){};
...Source.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;
}备注:
发布于 2021-01-13 11:12:51
concept Printable = requires(std::ostream stream,const T& a)应该将引用作为输入(在朋友定义中也是如此):
template<typename T>
concept Printable = requires(std::ostream &stream,const T& a)
^~~~~~~
{
{stream << a} -> std::convertible_to<decltype(stream)>;
};除此之外,TestClass的加法和比较运算符应该被标记为const。如果您改变了这一点,它就编译得很好:现场演示。我进一步简化了您的示例,并将其放入一个文件中。因此,我不确定这是否解决了你所有的问题。
更新
从这个比较中可以看出,GCC和clang编译,但是MSVC仍然拒绝代码。
发布于 2021-01-13 11:12:37
你不应该以价值来获取溪流。它们是不可复制的。
friend std::ostream& operator<<(std::ostream& stream, const TestClass& test)您需要限定您的+和<,因为约束查看const T &
TestClass operator+(const TestClass& t) const;
bool operator<(const TestClass& t) const;旁白:为什么您只为+、<<和<定义了一个概念?std::three_way_comparable怎么了?
为什么static_assert是可分配的,而不是概念?
https://stackoverflow.com/questions/65700218
复制相似问题