Подскажите, пожалуйста, с чем может быть связана эта ошибка линковки:
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 ничего не видно.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей