【发布时间】:2015-11-25 16:27:24
【问题描述】:
我遇到了一个奇怪的问题,尝试 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;
};
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:未解析的外部符号“公共:类 std::basic_string,类 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 关键字只是对编译器的“提示”,在这里可能没有真正的价值,但它仍然不应该破坏代码!
为什么会这样?
【问题讨论】:
-
内联函数应该在头文件中定义,而不是在单独的文件中。
-
[OT]:
(void)在 C++ 中不是必需的。 -
@Jarod42 我知道这不是必需的,但 Visual Studio 似乎默认将它放在那里(当它为你自动生成代码时)所以我只是保持一致。
标签: c++ visual-studio-2012 inline header-files member-functions