Почему мои встроенные функции имеют ошибку компоновки? - PullRequest
1 голос
/ 08 апреля 2020

Я изучаю C ++ и в настоящее время тестирую встроенные функции. Если я сейчас выполню свой код, у меня будет ошибка компоновки, но если я изменю
inline void Test::print40() на void Test::print40(), все будет хорошо. Не могли бы вы объяснить мне, почему у меня есть ошибка и как использовать встроенную функцию в этом случае.

// main.cpp file
#include "Test.h"
using namespace std;

int main()
{
    Test obj1;
    obj1.print40();
}
// Test.cpp file
#include <iostream>
#include "Test.h"

inline void Test::print40()
{
    std::cout << "40";
}
// Test.h file
#pragma once

class Test
{
public:
    void print40();
};

1 Ответ

1 голос
/ 08 апреля 2020

Определение встроенной функции должно быть в каждой единице компиляции, где используется ODR.

С другой стороны, в вашем проекте main модуля компиляции не знает, что эта функция является встроенной функцией. Поэтому он не может найти свое определение.

Переместите это определение из Test.cpp

#pragma once

class Test
{
public:
    void print40();
};

inline void Test::print40()
{
    std::cout << "40";
}

в заголовок Test.h.

Модуль Test.cpp является избыточным .

Поскольку функция очень простая и короткая, ее можно определить в определении класса, например,

class Test
{
public:
    void print40()
    {
        std::cout << "40";
    }
};

В этом случае она будет встроенной функцией по умолчанию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...