Overview
I am trying to make my custom class which read/write in binary files. I don't want to use any external sources. But because I am trying to make it pretty generic (as I show in the Example section) I got Error: 12 duplicate symbols for architecture x86_64(The full error is down bellow the hpp file) . I now it is from the template functions but I am not sure how to differentiate the four different type of types I am interested in.
Example
FileInteractor myInteractor;
myInteractor.writeNext<std::string>(someString);
myInteractor.writeNext<int>(someInt);
myInteractor.writeNext<double>(someDouble);
myInteractor.writeNext<std::vector<int>>(someVector);
myInteractor.writeNext<std::map<std::pair<std::string, std::string>>>(someMap);
And the same for the reading: something = readNext<...>();
The specifications I am using for writing to the file are:
int, double, boolare written directly to the filestd::string- first is written the length of the string then the actual string itselfstd::pair<std::string, std::string>is written as two following strings (I am not interested in other combinations ofstd::pair)std::vector, std::mapare written like thestd::string, first the length of the container then the elements
Code
- The header file:
//
// FileInteractor.hpp
//
// Created by Hristo Todorov on 5.01.21.
//
#ifndef FileInteractor_hpp
#define FileInteractor_hpp
#include <stdio.h>
#include <iostream>
#include <fstream>
#include <string>
class FileInteractor {
std::fstream file;
public:
FileInteractor();
FileInteractor(const std::string filename);
// template<typename Value>
// void writeNext(Value value);
//
// template<template<class, class> class Container, class Object>
// void writeNext(Container<Object*, std::allocator<Object*>>);
//
// template <typename Type>
// Type readNext();
//
// template<template<class, class> class Container, class Object>
// Container<Object*, std::allocator<Object*>> readNext();
template<typename Value>
void writeNext(Value value) {
file.write((char*)&value, sizeof(Value));
}
template<template<class, class> class Container, class Object>
void writeNext(Container<Object*, std::allocator<Object*>> container) {
using Type = typename Container<Object*, std::allocator<Object*>>::value_type;
writeNext<size_t>(container.size());
for (Type child : container) {
writeNext<Type>(child);
}
}
template<>
void writeNext(std::string string) {
size_t strSize = string.size();
file.write((char*)&strSize, sizeof(size_t));
file.write(string.c_str(), strSize);
}
template<>
void writeNext(std::pair<std::string, std::string> pair){
writeNext(pair.first);
writeNext(pair.second);
}
template<template<class, class> class Container, class Object>
Container<Object*, std::allocator<Object*>> readNext(){
using It = typename Container<Object*, std::allocator<Object*>>::iterator;
using Type = typename Container<Object*, std::allocator<Object*>>::value_type;
size_t containerLen = readNext<size_t>();
Container<Object*, std::allocator<Object*>> container;
for (size_t i = 0; i < containerLen; i++) {
container.insert(container.begin() + container.size(), readNext<Type>());
}
return container;
}
template<typename Value>
Value readNext(){
Value value;
file.read((char*)&value, sizeof(Value));
return value;
}
template <>
std::string readNext() {
size_t stringLen;
file.read((char*)&stringLen, sizeof(size_t));
char *str = new char[stringLen + 1];
file.read(str, stringLen);
str[stringLen] = '\0';
std::string string(str);
delete[] str;
return string;
}
template<>
std::pair<std::string, std::string> readNext(){
std::string first = readNext<std::string>();
std::string second = readNext<std::string>();
return std::make_pair(first, second);
}
void start(const std::string);
void stop();
};
#endif /* FileInteractor_hpp */
Full Error
duplicate symbol 'FileInteractor::stop()' in:
/Users/hristotodorov/Library/Developer/Xcode/DerivedData/MinimalistSUBD-fmomyqbdbswfghgqfzxnrumvwnsn/Build/Intermediates.noindex/MinimalistSUBD.build/Debug/MinimalistSUBD.build/Objects-normal/x86_64/main.o
/Users/hristotodorov/Library/Developer/Xcode/DerivedData/MinimalistSUBD-fmomyqbdbswfghgqfzxnrumvwnsn/Build/Intermediates.noindex/MinimalistSUBD.build/Debug/MinimalistSUBD.build/Objects-normal/x86_64/FileInteractor.o
duplicate symbol 'FileInteractor::FileInteractor()' in:
/Users/hristotodorov/Library/Developer/Xcode/DerivedData/MinimalistSUBD-fmomyqbdbswfghgqfzxnrumvwnsn/Build/Intermediates.noindex/MinimalistSUBD.build/Debug/MinimalistSUBD.build/Objects-normal/x86_64/main.o
/Users/hristotodorov/Library/Developer/Xcode/DerivedData/MinimalistSUBD-fmomyqbdbswfghgqfzxnrumvwnsn/Build/Intermediates.noindex/MinimalistSUBD.build/Debug/MinimalistSUBD.build/Objects-normal/x86_64/FileInteractor.o
duplicate symbol 'FileInteractor::FileInteractor()' in:
/Users/hristotodorov/Library/Developer/Xcode/DerivedData/MinimalistSUBD-fmomyqbdbswfghgqfzxnrumvwnsn/Build/Intermediates.noindex/MinimalistSUBD.build/Debug/MinimalistSUBD.build/Objects-normal/x86_64/main.o
/Users/hristotodorov/Library/Developer/Xcode/DerivedData/MinimalistSUBD-fmomyqbdbswfghgqfzxnrumvwnsn/Build/Intermediates.noindex/MinimalistSUBD.build/Debug/MinimalistSUBD.build/Objects-normal/x86_64/FileInteractor.o
duplicate symbol 'FileInteractor::start(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >)' in:
/Users/hristotodorov/Library/Developer/Xcode/DerivedData/MinimalistSUBD-fmomyqbdbswfghgqfzxnrumvwnsn/Build/Intermediates.noindex/MinimalistSUBD.build/Debug/MinimalistSUBD.build/Objects-normal/x86_64/main.o
/Users/hristotodorov/Library/Developer/Xcode/DerivedData/MinimalistSUBD-fmomyqbdbswfghgqfzxnrumvwnsn/Build/Intermediates.noindex/MinimalistSUBD.build/Debug/MinimalistSUBD.build/Objects-normal/x86_64/FileInteractor.o
duplicate symbol 'FileInteractor::FileInteractor(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >)' in:
/Users/hristotodorov/Library/Developer/Xcode/DerivedData/MinimalistSUBD-fmomyqbdbswfghgqfzxnrumvwnsn/Build/Intermediates.noindex/MinimalistSUBD.build/Debug/MinimalistSUBD.build/Objects-normal/x86_64/main.o
/Users/hristotodorov/Library/Developer/Xcode/DerivedData/MinimalistSUBD-fmomyqbdbswfghgqfzxnrumvwnsn/Build/Intermediates.noindex/MinimalistSUBD.build/Debug/MinimalistSUBD.build/Objects-normal/x86_64/FileInteractor.o
duplicate symbol 'FileInteractor::FileInteractor(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >)' in:
/Users/hristotodorov/Library/Developer/Xcode/DerivedData/MinimalistSUBD-fmomyqbdbswfghgqfzxnrumvwnsn/Build/Intermediates.noindex/MinimalistSUBD.build/Debug/MinimalistSUBD.build/Objects-normal/x86_64/main.o
/Users/hristotodorov/Library/Developer/Xcode/DerivedData/MinimalistSUBD-fmomyqbdbswfghgqfzxnrumvwnsn/Build/Intermediates.noindex/MinimalistSUBD.build/Debug/MinimalistSUBD.build/Objects-normal/x86_64/FileInteractor.o
duplicate symbol 'FileInteractor::stop()' in:
/Users/hristotodorov/Library/Developer/Xcode/DerivedData/MinimalistSUBD-fmomyqbdbswfghgqfzxnrumvwnsn/Build/Intermediates.noindex/MinimalistSUBD.build/Debug/MinimalistSUBD.build/Objects-normal/x86_64/main.o
/Users/hristotodorov/Library/Developer/Xcode/DerivedData/MinimalistSUBD-fmomyqbdbswfghgqfzxnrumvwnsn/Build/Intermediates.noindex/MinimalistSUBD.build/Debug/MinimalistSUBD.build/Objects-normal/x86_64/InfoFileReader.o
duplicate symbol 'FileInteractor::FileInteractor()' in:
/Users/hristotodorov/Library/Developer/Xcode/DerivedData/MinimalistSUBD-fmomyqbdbswfghgqfzxnrumvwnsn/Build/Intermediates.noindex/MinimalistSUBD.build/Debug/MinimalistSUBD.build/Objects-normal/x86_64/main.o
/Users/hristotodorov/Library/Developer/Xcode/DerivedData/MinimalistSUBD-fmomyqbdbswfghgqfzxnrumvwnsn/Build/Intermediates.noindex/MinimalistSUBD.build/Debug/MinimalistSUBD.build/Objects-normal/x86_64/InfoFileReader.o
duplicate symbol 'FileInteractor::FileInteractor()' in:
/Users/hristotodorov/Library/Developer/Xcode/DerivedData/MinimalistSUBD-fmomyqbdbswfghgqfzxnrumvwnsn/Build/Intermediates.noindex/MinimalistSUBD.build/Debug/MinimalistSUBD.build/Objects-normal/x86_64/main.o
/Users/hristotodorov/Library/Developer/Xcode/DerivedData/MinimalistSUBD-fmomyqbdbswfghgqfzxnrumvwnsn/Build/Intermediates.noindex/MinimalistSUBD.build/Debug/MinimalistSUBD.build/Objects-normal/x86_64/InfoFileReader.o
duplicate symbol 'FileInteractor::start(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >)' in:
/Users/hristotodorov/Library/Developer/Xcode/DerivedData/MinimalistSUBD-fmomyqbdbswfghgqfzxnrumvwnsn/Build/Intermediates.noindex/MinimalistSUBD.build/Debug/MinimalistSUBD.build/Objects-normal/x86_64/main.o
/Users/hristotodorov/Library/Developer/Xcode/DerivedData/MinimalistSUBD-fmomyqbdbswfghgqfzxnrumvwnsn/Build/Intermediates.noindex/MinimalistSUBD.build/Debug/MinimalistSUBD.build/Objects-normal/x86_64/InfoFileReader.o
duplicate symbol 'FileInteractor::FileInteractor(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >)' in:
/Users/hristotodorov/Library/Developer/Xcode/DerivedData/MinimalistSUBD-fmomyqbdbswfghgqfzxnrumvwnsn/Build/Intermediates.noindex/MinimalistSUBD.build/Debug/MinimalistSUBD.build/Objects-normal/x86_64/main.o
/Users/hristotodorov/Library/Developer/Xcode/DerivedData/MinimalistSUBD-fmomyqbdbswfghgqfzxnrumvwnsn/Build/Intermediates.noindex/MinimalistSUBD.build/Debug/MinimalistSUBD.build/Objects-normal/x86_64/InfoFileReader.o
duplicate symbol 'FileInteractor::FileInteractor(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >)' in:
/Users/hristotodorov/Library/Developer/Xcode/DerivedData/MinimalistSUBD-fmomyqbdbswfghgqfzxnrumvwnsn/Build/Intermediates.noindex/MinimalistSUBD.build/Debug/MinimalistSUBD.build/Objects-normal/x86_64/main.o
/Users/hristotodorov/Library/Developer/Xcode/DerivedData/MinimalistSUBD-fmomyqbdbswfghgqfzxnrumvwnsn/Build/Intermediates.noindex/MinimalistSUBD.build/Debug/MinimalistSUBD.build/Objects-normal/x86_64/InfoFileReader.o
ld: 12 duplicate symbols for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Aucun commentaire:
Enregistrer un commentaire