Подскажите, пожалуйста, с чем может быть связана эта ошибка линковки:
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
ругается линковщик. В чем тут проблема?
У вас какое шиворот-навыворот наблюдается.
Основное назначение ключевого слова inline
в языке С++ - дать вам возможность помещать определения сущностей (функций и переменных) напрямую в заголовочные файлы, т.е. в файлы, которые будут много раз включаться в тексте программы. Использование ключевого слова inline
предотвратит ошибки компиляции (множественного определения), которые в таком случае возникли бы без inline
.
Все.
Вы использовали в своем коде ключевое слово inline
с методами класса, но определение этих методов в заголовочный файл не поместили. Зачем же вы тогда вообще использовали ключевое слово inline
???
Если вы объявили некую сущность как inline
, то определение этой сущности должно быть видно везде, где эта сущность используется. У вас же из Source.cpp
ничего не видно.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
ReSharper выдаёт предупреждение "function-like macro used; consider a constexpr template function", что значит: используйте constexpr функцию, вместо defineно при этом ReSharper не говорит...
Я работаю с либой FFmpeg и здесь есть возможность передать путь к mp4 файлу и прочитать егоНо я ищу возможность передать не путь к файлу, а передать...
Нарпимер если сделать обфускацию js то есть шанс,найти хороший обфускаторый который на данный момент времени не могут расшифроватьА как быть...