为什么内联我的访问器会破坏我的代码?

tjw*_*992 9 c++ inline member-functions header-files visual-studio-2012

我遇到一个奇怪的问题,尝试inline我的"Person"类的访问器导致代码无法编译.

以下代码将成功编译并运行(使用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;
};
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

如果我将访问者更改为定义为 inline 函数,则代码会中断.

在Person.h中内联访问器

// Accessors
inline string name(void) const;
inline int    age (void) const;
Run Code Online (Sandbox Code Playgroud)

在Person.cpp中内联访问器

inline string Person::name(void) const
{
    return m_name;
}

inline int Person::age(void) const
{
    return m_age;
}
Run Code Online (Sandbox Code Playgroud)

这样做会产生以下错误:

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 @ std @@ V?$ allocator @ D @ 2 @@ std @@ XZ)在函数_wmain中引用

1>致命错误LNK1120:1个未解析的外部

上帝,错误信息是神秘的...感谢所有这些哦有用的信息Microsoft/Visual Studio!


我知道inline关键字只是编译器的"提示",可能在这里没有实际价值,但它仍然不应该破坏代码!

为什么会这样?

Ser*_*eyA 3

我不是语言律师,所以我无法判断编译器行为是否合法。然而,我可以解释正在发生的事情。

当您标记函数时inline,您并没有暗示编译器可以内联该函数。十多年来,编译器不再需要您的提示。他们知道何时内联。相反,您所做的是将函数定义指示为包含在其中的每个翻译单元的本地函数定义。为此定义应该可用。

实际上,您所说的是name()每个.cpp文件的定义都应该是本地的,但您并没有使其对每个.cpp文件都可用!我仍然相信编译器可以在这里发出警告。