Ошибка с inline

76
20 июня 2021, 05:30

Подскажите, пожалуйста, с чем может быть связана эта ошибка линковки:

1>Source.obj : error LNK2019: unresolved external symbol "public: char const * __thiscall my::string::c_str(void)const " (?c_str@string@my@@QBEPBDXZ) referenced in function _main  
1>Source.obj : error LNK2019: unresolved external symbol "public: unsigned int __thiscall my::string::length(void)const " (?length@string@my@@QBEIXZ) referenced in function _main

Сам код:

// string.h
#pragma once
#include <cstddef>
#include <cassert>
#include <cstring>
namespace my {
    class string
    {
    private:
        char *m_Str;
        std::size_t m_Size;         
        std::size_t m_Capacity;
    public:
        string();
        // copy ctor
        string(const string& str);
        string(const char *str);
        inline const char *c_str() const noexcept;
        inline std::size_t length() const noexcept;
    };
}
// string.c
#include "string.h"
namespace my {
    string::string()
        : m_Str(nullptr), m_Size(0), m_Capacity(0)
    {
    }
    string::string(const string & str)
    {
        m_Size = str.m_Size;
        m_Capacity = str.m_Capacity;
        if (m_Capacity == 0)
        {
            m_Str = nullptr;
        }
        else
        {
            m_Str = new char[m_Capacity];
            assert(m_Str != nullptr);
            memcpy(m_Str, &str, m_Capacity);
        }
    }
    string::string(const char * str)
    {
        if (str)
        {
            m_Size = m_Capacity = strlen(str) + 1;
            m_Str = new char[m_Capacity];
            assert(m_Str != nullptr);
            std::strcpy(m_Str, str);
        }
        assert(str != nullptr);
    }
    inline const char * string::c_str() const noexcept
    {
        return m_Str;
    }
    inline std::size_t string::length() const noexcept
    {
        return m_Size ? m_Size - 1 : m_Size;
    }
}
// Source.c
#include <iostream>
#include "string.h"
using namespace my;
int main()
{
    const char *c = "Hello world";
    string a = c;
    const char *b = a.c_str();
    int size = a.length();
}

Если убратьinline, то все будет работать, а с inline ругается линковщик. В чем тут проблема?

Answer 1

У вас какое шиворот-навыворот наблюдается.

Основное назначение ключевого слова inline в языке С++ - дать вам возможность помещать определения сущностей (функций и переменных) напрямую в заголовочные файлы, т.е. в файлы, которые будут много раз включаться в тексте программы. Использование ключевого слова inline предотвратит ошибки компиляции (множественного определения), которые в таком случае возникли бы без inline.

Все.

Вы использовали в своем коде ключевое слово inline с методами класса, но определение этих методов в заголовочный файл не поместили. Зачем же вы тогда вообще использовали ключевое слово inline???

Если вы объявили некую сущность как inline, то определение этой сущности должно быть видно везде, где эта сущность используется. У вас же из Source.cpp ничего не видно.

READ ALSO
constexpr функция вместо define &ldquo;функции&rdquo;

constexpr функция вместо define “функции”

ReSharper выдаёт предупреждение "function-like macro used; consider a constexpr template function", что значит: используйте constexpr функцию, вместо defineно при этом ReSharper не говорит...

111
Как передать ByteBuffer в FFmpeg?

Как передать ByteBuffer в FFmpeg?

Я работаю с либой FFmpeg и здесь есть возможность передать путь к mp4 файлу и прочитать егоНо я ищу возможность передать не путь к файлу, а передать...

67
Чем плохи кастомные атрибуты

Чем плохи кастомные атрибуты

Слышал о том, что кастомные атрибуты это не есть хорошо

119
Есть ли смысл в обфускация html и css?

Есть ли смысл в обфускация html и css?

Нарпимер если сделать обфускацию js то есть шанс,найти хороший обфускаторый который на данный момент времени не могут расшифроватьА как быть...

86