Пишу курсач на тему "Дерево Меркла для хеш функций", написал код реализации дерево меркла, сам хеш-генератор взял у https://github.com/okdshin, при попытки компиляции main.cpp, который содержит следующий код
#include <iostream>
#include "TreeStruct.h"
int main() {
std::vector<Node*> leaves;
//create sample data
leaves.push_back(new Node(hash_sha256("aksl;fjk;kla")));
leaves.push_back(new Node(hash_sha256("1234")));
// initialize leaves
for (unsigned int i = 0; i < leaves.size(); i++) {
leaves[i]->left = NULL;
leaves[i]->right = NULL;
}
MerkleTree* hashTree = new MerkleTree(leaves);
std::cout << hashTree->root->hash << std::endl;
hashTree->printTree(hashTree->root, 0);
for (unsigned int k = 0; k < leaves.size(); k++) {
delete leaves[k];
}
delete hashTree;
return 0;
}
Получаю ошибку
Ошибка LNK2019 ссылка на неразрешенный внешний символ "public: __thiscall Node::Node(class std::basic_string<char,struct std::char_traits,class std::allocator >)" (??0Node@@QAE@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z) в функции _main. Mercle_tree_cour C:\Users\Konstantin\source\repos\Mercle_tree_cour\Mercle_tree_cour\main.obj 1
При этом в самой реализации дерева меркла тоже все вроде как нормально
#include <string>
#include <unordered_map>
#include <iostream>
#include <iomanip>
#include "SHA256.h"
#include <vector>
#include "misc.h"
#include <string>
#include "TreeStruct.h"
using namespace std;
MerkleTree::MerkleTree(std::vector<Node> blocks) {
std::vector<Node> nodes;
while (blocks.size() != 1) {
printNodeHashes(blocks);
for (unsigned int l = 0, n = 0; l < blocks.size(); l = l + 2, n++) {
if (l != blocks.size() - 1) {
nodes.push_back(new Node(hash_sha256(blocks[l]->hash + blocks[l + 1]->hash)));
nodes[n]->left = blocks[l];
nodes[n]->right = blocks[l + 1];
}
else {
nodes.push_back(blocks[l]);
}
}
std::cout << "\n";
blocks = nodes;
nodes.clear();
}
this->root = blocks[0];
}
MerkleTree::~MerkleTree() {
deleteTree(root);
std::cout << "Tree deleted" << std::endl;
}
void MerkleTree::printTree(Node* n, int indent) {
if (n) {
if (n->left) {
printTree(n->left, indent + 4);
}
if (n->right) {
printTree(n->right, indent + 4);
}
if (indent) {
std::cout << std::setw(indent) << ' ';
}
std::cout << n->hash[0] << "\n ";
}
}
void MerkleTree::deleteTree(Node* n) {
if (n) {
deleteTree(n->left);
deleteTree(n->right);
n = NULL;
delete n;
}
}
Но компилятор и на него показывает мол есть ошибка "Неразрешенный внешний символ"
Ошибка LNK2001 неразрешенный внешний символ "public: __thiscall Node::Node(class std::basic_string<char,struct std::char_traits,class std::allocator >)" (??0Node@@QAE@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z). Mercle_tree_cour C:\Users\Konstantin\source\repos\Mercle_tree_cour\Mercle_tree_cour\Mercle_tree_cour.obj 1
Помогите понять в чем может быть проблема
UPD:
misc.h
#pragma once
#ifndef MISC_H
#define MISC_H
#include <iostream>
#include <string>
#include "TreeStruct.h"
#include "SHA256.h"
inline std::string hash_sha256(std::string src_str) {
std::string hash_hex_str = picosha2::hash256_hex_string(src_str);
return hash_hex_str;
}
inline void printNodeHashes(std::vector<Node*> v) {
for (unsigned int a = 0; a < v.size(); a++) {
std::cout << v[a]->hash << std::endl;
}
}
#endif
TreeStruct.h
#pragma once
#include <vector>
#include <string>
#include <iostream>
#include "Node.h"
#include "SHA256.h"
#include "misc.h"
struct MerkleTree {
Node* root;
MerkleTree(std::vector<Node*> blocks);
~MerkleTree();
void printTree(Node* n, int indent);
void deleteTree(Node* n);
};
Node.h
#pragma once
#ifndef NODE_H
#define NODE_H
#include <string>
struct Node {
std::string hash;
Node* left;
Node* right;
Node(std::string data);
};
#endif
Node. В ошибке же он мелькает. – HolyBlackCat May 22 '22 at 13:20Node(std::string data);. А определение его где-то есть? – HolyBlackCat May 22 '22 at 13:24