我正在尝试在 C++ 中创建一个陷阱类。我有这个类的 .h 和 .cpp 文件,以及一个测试类。当我尝试构建它时,我的 'add' 方法给了我以下错误:“错误 C2678:二进制 '<=>':未找到采用 'E' 类型的左操作数的运算符(或者没有可接受的转换)"
这是我的代码:
处理.h
#pragma once
#include <compare>
#include <string>
#include <random>
#include <stack>
template<class E>
class Treap
{
public:
class Node {
public:
// data fields
E data; // key for the search
int priority; // random heap priority
Node* left;
Node* right;
// omitted constructor for brevity
// omitted rotation methods for brevity
};
private:
// data fields
Node* root;
// methods
// omitted reheap method for brevity
public:
// omitted constructors for brevity
// omitted methods for brevity
};
treap.cpp
#include "Treap.h"
template<class E>
bool Treap<E>::add(E& key, int priority) {
Node* newNode = new Node(key, priority);
if (root == nullptr) {
root = newNode;
return true;
}
else {
// if key is found in tree, return false
std::stack<Node*> nodeStack;
Node* current = root;
Node* prev = nullptr;
auto n = current->data <=> key;
nodeStack.push(current);
while (n != 0 && current != nullptr) {
prev = current;
if (n > 0)
current = current->left;
else
current = current->right;
if (current == nullptr)
break;
nodeStack.push(current);
n = current->data <=> key;
}
if (n > 0)
prev->left = newNode;
else
prev->right = newNode;
// omitted method that reheaps the treap
}
return true;
}
TreapTest.cpp
#include "pch.h"
#include "CppUnitTest.h"
#include "../Treap.cpp"
using namespace Microsoft::VisualStudio::CppUnitTestFramework;
namespace TreapTest {
TEST_CLASS(TreapTest) {
public:
TEST_METHOD(addTest) {
Treap<std::string> test;
Assert::IsTrue(test.add(std::string("p"), 99)); // this seems to be the line causing the issue
}
};
}
导致错误的行是第 13 行和第 26 行(也就是飞船操作员的行)。我使用的是 VS 2019,C++ 语言标准是 C++20。PS:我是 C++ 的新手。我正在将现有的 Java 代码转换为 C++,作为理解和学习 C++ 的练习。
编辑:好的,我做了一些@cdhowie 和@interjay 建议的更改。但是这些建议都没有帮助解决这个特定问题(我有点预料到,因为代码编译时没有解决方案中的测试文件,这意味着尽管我犯了愚蠢的错误,但原始代码编译得很好)。
另外,@Barry,我希望这些更新更适合该标准。