命名空间中的内联函数给出了C ++的未定义引用

时间:2016-06-11 22:04:28

标签: c++ namespaces inline

我有一个非常简单的程序,我在其中定义自己的命名空间,需要有一个内联函数。这看起来像下面这样:

test.h

#ifndef _TEST_H_
#define _TEST_H_

#include <iostream>
using namespace std;

namespace NS
{

class EXAMPLE
{
    int i;
    float f;

public:

    void doSth();
};
}

#endif

TEST.CPP

#include "test.h"

namespace NS
{
inline void EXAMPLE::doSth()
{
    cout << i << f << "\n";
}
}

的main.cpp

#include "test.h"

int main()
{
    NS::EXAMPLE e;

    e.doSth();

    return 0;
}

我这样编译:{{1​​}}导致

g++ main.cpp test.cpp -o app

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

inline函数必须在使用它的所有翻译单元中定义为inline,并且定义相同。

基本上这意味着(1)仅在一个翻译单元中使用它,或者(2)将定义放在包含在使用该函数的每个翻译单元中的标题中。

用例(1)是需要inline提示效果的地方,它指示编译器在生成的机器代码中考虑是否内联对函数的调用。用例(2)是关于inline提供的保证,这种在多个翻译单元中的使用并不违反一个定义规则(或ODR,因为它通常被称为)