0

I am trying to implement a Utilities singleton class, which includes a helper function to format std::string's. The code is from this link here, std::string formatting like sprintf however I get a linker error somehow. (I modified const std::string& format to be a const char* format for performance, but both don't work). Here is the header file:

utilities.h

#pragma once

#ifndef UTILITIES_H
#define UTILITIES_H


#include <string>


class Utilities
{
public:
    Utilities(const Utilities&) = delete;
    Utilities(Utilities&&) = delete;
    Utilities& operator=(const Utilities&) = delete;
    Utilities& operator=(Utilities&&) = delete;

    template<typename ... Args>
    static std::string FormatString(const char* format, Args ... args);

private:
    Utilities();

    static Utilities& Get_Instance();
};

#endif // !UTILITIES_H

and utilities.cpp

#include "utilities.h"

#include <memory>
#include <string>
#include <stdexcept>

Utilities::Utilities()
{

}

Utilities& Utilities::Get_Instance()
{
    static Utilities instance;
    return instance;
}


template<typename ... Args>
std::string Utilities::FormatString(const char* format, Args ... args )
{
    int size_s = std::snprintf(nullptr, 0, format, args ...) + 1; // Extra space for '\0'
    if (size_s <= 0) { throw std::runtime_error("Error during formatting."); }
    auto size = static_cast<size_t>(size_s);
    auto buf = std::make_unique<char[]>(size);
    std::snprintf(buf.get(), size, format, args ...);
    return std::string(buf.get(), buf.get() + size - 1); // We don't want the '\0' inside
}

The linker error is:

Severity    Code    Description Project File    Line    Suppression State
Error   LNK2001 unresolved external symbol "public: static class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __cdecl Utilities::FormatString<double>(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,double)" (??$FormatString@N@Utilities@@SA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@ABV12@N@Z)  file.obj    1   

0 Answers0