mardi 5 janvier 2021

12 duplicate symbols for architecture x86_64 [closed]

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:

  1. int, double, bool are written directly to the file
  2. std::string - first is written the length of the string then the actual string itself
  3. std::pair<std::string, std::string> is written as two following strings (I am not interested in other combinations of std::pair)
  4. std::vector, std::map are written like the std::string, first the length of the container then the elements

Code

  1. 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