У меня возникла странная проблема, когда при попытке использовать inline
аксессоры для моего класса «Человек» заставляют код не скомпилироваться.Почему встраивание моих аксессуаров нарушает мой код?
Следующий код будет компилироваться и работать успешно (с помощью Visual Studio 2012):
Person.h
#pragma once
#include <string>
using namespace std;
class Person
{
public:
Person(string name, int age = 0);
~Person(void);
// Accessors
string name(void) const;
int age (void) const;
private:
string m_name;
int m_age;
};
Person.cpp
#include "stdafx.h"
#include "Person.h"
Person::Person(string name, int age) :
m_name(name),
m_age (age)
{}
Person::~Person(void) {}
string Person::name(void) const
{
return m_name;
}
int Person::age(void) const
{
return m_age;
}
header_test. cpp
#include "stdafx.h"
#include <iostream>
#include "Person.h"
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
Person p("Joe");
cout << p.name() << endl;
return 0;
}
Если я меняю аксессор быть определен какinline
функций кодовых брейков.
Встраивание в аксессоров в Person.h
// Accessors
inline string name(void) const;
inline int age (void) const;
Встраивание в аксессоров в Person.cpp
inline string Person::name(void) const
{
return m_name;
}
inline int Person::age(void) const
{
return m_age;
}
Делать это производит следующие ошибки:
1> header_test.obj: ошибка LNK2019: неразрешенный внешний символ "public: class std :: basic_string, class std :: allocator> __thiscall Person :: name (void) const" (? Name @ Person @@ QBE? AV? $ basic_string @ DU $ char_traits @ D @ станд @@ V $ распределитель @ D @ 2 @@ станд @@ XZ) упоминаться в функции _wmain
1> фатальной LNK1120 ошибки:? 1 неразрешенные внешние
Бог, что сообщение об ошибке является загадочным ... Спасибо за всю эту полезную информацию Microsoft/Visual Studio!
Я знаю, что ключевое слово inline
просто «намек» на компилятор и, вероятно, не имеет никакого реального значения здесь, но она до сих пор не должны нарушать код!
Почему это происходит?
Встроенные функции должны быть определены внутри файла заголовка, а не в отдельном файле. –
[OT]: '(void)' не требуется в C++. – Jarod42
@ Jarod42 Я знаю, что это не требуется, но Visual Studio, кажется, поместила его по умолчанию (когда он автоматически генерирует код для вас), поэтому я просто был последовательным. – tjwrona1992