内联说明符与类成员一起使用时的未定义引用

时间:2013-07-09 18:43:35

标签: c++ class inline member-functions

我在课堂上有一些成员函数。当我使用内联说明符时,编译器会抱怨未定义的引用。

我试过了:

使用'inline'仅在类头文件中的函数定义之前。

在类.cpp(指定成员函数)的函数声明之前使用'inline'文件。

同时执行上述两项操作。

显然,其中一种方法是正确的做法,而其他方法则不正确。但是,尝试每个选项并没有让我得到一个编译的程序。

以下是我要做的事情:

.hpp文件:

class A{
    void func();
}

.cpp文件:

...包括......

inline void A::func()
{ 
    ...
}

或者'内联'可能会转移到其他地方。我已经尝试了所有可能的组合,正如我上面所解释的那样。 (现在看一个人告诉我,我需要它在函数名和参数之后,比如关键字'const'。)

任何有关我做错的任何想法?我试着用谷歌搜索正确的答案,但没有运气。 “内联”函数是否在一个类中甚至是一个东西?

2 个答案:

答案 0 :(得分:7)

必须在头文件中定义内联函数。函数的定义(正文)必须在尝试使用该函数的所有翻译单元中可见。您可以直接在类中定义它。或者您可以在代码中定义它,即在类之外。但它必须在头文件中,而不是在.cpp文件中。

尝试在.cpp文件中定义内联函数将使其仅在.cpp文件中可用。尝试在其他.cpp文件中使用它会导致链接器错误(即“未定义的引用”错误)。

答案 1 :(得分:1)

inline任何内容放在CPP文件中只能内联该文件中的函数。如果您想鼓励编译器内联函数,您需要忘记CPP文件。相反,在hpp文件中执行此操作:

class A{
  inline void func();
};

void A::func() {...}

请注意几点:

  1. 内联并不意味着您的内联功能。这是对编译器的暗示。
  2. 你需要优化(gcc中的-O3)甚至有机会内联
  3. 如果在类中定义函数,它隐式具有inline关键字:

    class A{
      inline void func() {
        ...
      }
    };
    

    与上面的内容相同,在类中内联声明,定义在外面。

  4. 有很多方法可以强制GCC使用函数属性内联你的代码,但是我不会描述它们,因为使用它们很少是个好主意。关于每个函数的内联,GCC应该做“最好”的事情。强迫它做其他事情几乎总会导致性能下降。