简体   繁体   中英

cannot declare c++ function without template

i have a relatively small c++ project and i decided to make a Utils header file which would just contain some small helper functions etc. It was all working fine when i was declaring functions that were using a template, then i tried to make a function which didnt need a template, and suddently it doesn't work.

The result i get is a linker error; already defined in (file).obj

I cannot even declare a simple void function, everything without template gives a linker error.

I have NO IDEA whatsoever what could be causing this. Here is the code for the header file... Thanks in advance.

#pragma once

namespace Utils
{
    std::string GetActiveWindowTitle()
    {
        // This doesnt work either, also gives linker error.
        return active_window;
    }

    template<typename T>
    void Print(char * value, T printValue)
    {
        std::cout << value << ": " << printValue << std::endl;
    }

    template<typename T>
    void Print(T printValue)
    {
        std::cout << "DEBUG: " << printValue << std::endl;
    }

    void PrintStr(std::string str)
    {
        // This doesn't work because it doesnt have the template, it gives a linker error
        std::cout << "DEBUG: " << str.c_str() << std::endl;
    }
}

A function-template is implicitly inline . Thus, when defined in a header file, it doesn't violate ODR (One Definition Rule) . For non-template functions in header files, you should either define them as inline , or define them in a separate translation unit.

So, you could do:

#pragma once

namespace Utils
{
    inline std::string GetActiveWindowTitle()
    {
        return active_window;
    }

    template<typename T>
    void Print(char * value, T printValue)
    {
        std::cout << value << ": " << printValue << std::endl;
    }

    template<typename T>
    void Print(T printValue)
    {
        std::cout << "DEBUG: " << printValue << std::endl;
    }

    inline void PrintStr(std::string str)
    {
        std::cout << "DEBUG: " << str.c_str() << std::endl;
    }
}

See Inline keyword vs header definition

If you include your header to more than one cpp, the function will be defined more than once and the linker will give you the error described above. See What is the difference between a definition and a declaration? or What are forward declarations in C++?

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM