C++ 命名空间中的内联函数提供了对C+;的未定义引用+;

C++ 命名空间中的内联函数提供了对C+;的未定义引用+;,c++,namespaces,inline,C++,Namespaces,Inline,我有一个非常简单的程序,在其中我定义了自己的名称空间,并且需要一个内联函数。这看起来像下面这个: 测试.h #ifndef _TEST_H_ #define _TEST_H_ #include <iostream> using namespace std; namespace NS { class EXAMPLE { int i; float f; public: void doSth(); }; } #endif 我这样编译它:g++main.

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

测试.h

#ifndef _TEST_H_
#define _TEST_H_

#include <iostream>
using namespace std;

namespace NS
{

class EXAMPLE
{
    int i;
    float f;

public:

    void doSth();
};
}

#endif
我这样编译它:
g++main.cpp test.cpp-o app
,结果是

/tmp/ccFwG8do.o: In function `main':
main.cpp:(.text+0x10): undefined reference to `NS::EXAMPLE::doSth()'
collect2: error: ld returned 1 exit status

有什么想法吗?

一个
内联
函数必须在使用它的所有翻译单元中定义为
内联
,定义相同

本质上,这意味着要么(1)只在一个翻译单元中使用它,要么(2)将定义放在包含在使用函数的每个翻译单元中的标题中


用例(1)是一个希望代码提示>内联的提示作用,它指示编译器在生成的机器代码中考虑是否对函数进行内联调用。用例(2)是关于

inline
提供的保证,即在多个翻译单元中使用该函数不会违反一个定义规则(或通常所指的ODR)。在使用该函数的所有翻译单元中,必须使用相同的定义将
inline
函数定义为
inline

本质上,这意味着要么(1)只在一个翻译单元中使用它,要么(2)将定义放在包含在使用函数的每个翻译单元中的标题中


用例(1)是一个希望代码提示>内联的提示作用,它指示编译器在生成的机器代码中考虑是否对函数进行内联调用。用例(2)是关于

inline
所提供的保证,即在多个翻译单元中的这种使用不会违反一个定义规则(或者经常提到的ODR)。

如果您希望它是内联的,那么实现必须在头中,并且需要在那里声明为inline。否则,编译器无法将其内联到其他编译单元中,因为它看不到详细信息。注意:
\u TEST\u H
是保留名称。注意:
使用名称空间std。例如,使用名称
distance
并包含该标题的代码可能会导致名称冲突。Ungood.注意:所有大写名称
NS
示例
都可能与宏名称冲突,导致意外和不需要的文本替换。要避免这种情况,常用的惯例是,所有宏都使用大写名称,并且只适用于宏。“医生,如果我这样移动手臂会很痛。”“那么,不要那样移动手臂。”如果您希望它是内联的,则实现必须在头中,并且需要在那里声明为内联。否则,编译器无法将其内联到其他编译单元中,因为它看不到详细信息。注意:
\u TEST\u H
是保留名称。注意:
使用名称空间std。例如,使用名称
distance
并包含该标题的代码可能会导致名称冲突。Ungood.注意:所有大写名称
NS
示例
都可能与宏名称冲突,导致意外和不需要的文本替换。避免这种情况的常见惯例是,对所有宏使用所有大写名称,并且只对宏使用。“医生,如果我这样移动手臂会很痛。”“那么,不要那样移动手臂。”
#include "test.h"

int main()
{
    NS::EXAMPLE e;

    e.doSth();

    return 0;
}
/tmp/ccFwG8do.o: In function `main':
main.cpp:(.text+0x10): undefined reference to `NS::EXAMPLE::doSth()'
collect2: error: ld returned 1 exit status