将错误与静态方法链接

Linking error with static methods

本文关键字:链接 静态方法 错误      更新时间:2023-10-16

我不知道这里出了什么问题。我有一个ConsoleIO类,它包含两个方法:

static void OutputMessage(const std::string &message);
static void OutputMessageNoNewLine(const std::string &message);

它们在标题中内联定义:

inline void ConsoleIO::OutputMessage(const std::string &message)
{
    std::cout << message << std::endl;
}
inline void OutputMessageNoNewLine(const std::string &message)
{
    std::cout << message << " ";
    std::flush(std::cout);
}

还有另一个类,ContentParser,具有以下方法:

static const bool                   StringEquals(const char *a, const char *b);
                                    template <typename T>
static const std::string            NumToString(const T num);
                                    template <typename T>
static const T                      StringToNum(const std::string &s);

它们在单独的文件ContentParser.cpp中定义。

template <typename T>
const std::string ContentParser::NumToString(const T num)
{
    std::ostringstream ss;
    ss << num;
    return ss.str();
}

我在AdventureGame类中有以下代码:

ConsoleIO::OutputMessageNoNewLine(ContentParser::NumToString(num+1));
ConsoleIO::OutputMessage(" - " + decision.choices.at(num).text);

奇怪的是,从上面来看,底线运行良好,但顶部在链接时会产生错误(第65行错误)。StringEquals方法也适用于所有地方。

这是构建日志:

14:03:02 **** Incremental Build of configuration Debug for project AdventureGame ****
Info: Internal Builder is used for build
g++ -O0 -g3 -Wall -c -fmessage-length=0 -std=c++11 -o AdventureGame.o "..\AdventureGame.cpp" 
g++ "-LD:\Program Files\tinyxml2-master" -o AdventureGame.exe tinyxml2.o Main.o ContentParser.o AdventureGame.o -ltinyxml 
AdventureGame.o: In function `AdventureGame::ProcessDecision()':
D:adateclipseAdventureGameDebug/../AdventureGame.cpp:65: undefined reference to `std::string const ContentParser::NumToString<unsigned int>(unsigned int)'
D:adateclipseAdventureGameDebug/../AdventureGame.cpp:65: undefined reference to `ConsoleIO::OutputMessageNoNewLine(std::string const&)'
D:adateclipseAdventureGameDebug/../AdventureGame.cpp:68: undefined reference to `ConsoleIO::OutputMessageNoNewLine(std::string const&)'
collect2.exe: error: ld returned 1 exit status

我错过了什么?

inline void OutputMessageNoNewLine(const std::string &message)
{
    std::cout << message << " ";
    std::flush(std::cout);
}

应该是这个吗

inline void ConsoleIO::OutputMessageNoNewLine(const std::string &message)
{
    std::cout << message << " ";
    std::flush(std::cout);
}

容易犯错误。