Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 与类成员一起使用内联说明符时未定义的引用_C++_Class_Inline_Member Functions - Fatal编程技术网

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

C++ 与类成员一起使用内联说明符时未定义的引用,c++,class,inline,member-functions,C++,Class,Inline,Member Functions,我在一个类中有一些成员函数。当我使用内联说明符时,编译器会抱怨引用未定义 我试过: 仅在类头文件中的函数定义前面使用“inline” 在class.cpp中的函数声明之前使用“inline”,其中成员函数仅在文件中指定 同时执行上述两项操作 显然,其中一种方法是正确的,而其他方法则不正确。然而,尝试每个选项并没有让我得到一个编译的程序 以下是我试图做的: .hpp文件: class A{ void func(); } class A{ inline void func(); };

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

我试过:

仅在类头文件中的函数定义前面使用“inline”

在class.cpp中的函数声明之前使用“inline”,其中成员函数仅在文件中指定

同时执行上述两项操作

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

以下是我试图做的:

.hpp文件:

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

void A::func() {...}
.cpp文件:

。。。包括

inline void A::func()
{ 
    ...
}
或者“内联”可能会出现在其他地方。正如我上面解释的,我已经尝试了我能想到的所有可能的组合。现在看看有人告诉我,我需要在函数名和参数之后使用它,比如关键字“const”


有人知道我做错了什么吗?我试着用谷歌搜索正确答案,但没有成功。类中的“内联”函数是一种东西吗?

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


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

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

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

将内联任何内容放入cpp文件中只能内联该文件中的函数。如果希望鼓励编译器内联函数,则需要忘记CPP文件。而是在hpp文件中执行以下操作:

class A{
  inline void func();
};

void A::func() {...}
注意:有几点:

内联并不意味着函数将内联。这是对编译器的提示。 您需要在gcc中优化-O3,以便有机会将其内联 如果在类内定义函数,则它隐式地在以下位置上具有内联关键字:

class A{
  inline void func() {
    ...
  }
};
与上面相同,它在类中内联声明,而定义在外部

有一些方法可以强制GCC使用函数属性内联代码,但我不会描述它们,因为使用它们很少是一个好主意。对于每个函数的内联,GCC应该做得最好。强制它执行其他操作几乎总是会导致性能下降。

在CPP文件中插入任何内联内容都只能将函数内联到该文件中。如果希望鼓励编译器内联函数,则需要忘记CPP文件。而是在hpp文件中执行以下操作:

class A{
  inline void func();
};

void A::func() {...}
注意:有几点:

内联并不意味着函数将内联。这是对编译器的提示。 您需要在gcc中优化-O3,以便有机会将其内联 如果在类内定义函数,则它隐式地在以下位置上具有内联关键字:

class A{
  inline void func() {
    ...
  }
};
与上面相同,它在类中内联声明,而定义在外部


有一些方法可以强制GCC使用函数属性内联代码,但我不会描述它们,因为使用它们很少是一个好主意。对于每个函数的内联,GCC应该做得最好。强制它执行其他操作几乎总是会导致性能下降。

为什么要将该函数标记为内联?您可能会有一种奇怪的想法,即inline关键字与编译器内联代码有某种关联……这不是内联函数吗?不,不是真的。。。“内联”仅意味着实现工具集“编译器+链接器”可以看到在多个翻译单元中定义的完全相同的函数,这不会导致违反“一个定义”规则。除此之外,编译器是内联代码还是生成外联定义是完全不同的,但在一般情况下,如果定义出现在标题中,则.cpp将不起作用。为什么要将该函数标记为内联?您可能会有一种奇怪的想法,即inline关键字与编译器内联代码有某种关联……这不是内联函数吗?不,不是真的。。。内联仅意味着实现工具集编译器+链接器可以看到
e在多个翻译单元中定义的相同功能,不会违反一个定义规则。除此之外,编译器是内联代码还是生成一个行外定义是完全不同的,但在一般情况下,如果定义出现在标题中,则.cpp不起作用。@Edward Bird:不起作用。您得到的未定义引用正是:g++不同意您的意见,也同意我的意见。在头文件中,我有一个函数,我已指定为内联函数。如果没有内联关键字,它可以很好地编译。爱德华·伯德:是的,这正是我要告诉你的。非内联函数必须在一个位置定义,并且只能在一个位置定义。这就是您通常将定义放入.cpp文件的原因。但内联函数必须在使用它的每个翻译单元的任何地方反复定义。这就是内联函数通常在头文件中定义的原因。换句话说,您不能通过添加/删除内联关键字在内联和非内联版本之间切换。每次切换时都必须重新组织代码。@EdwardBird,真的吗?试图用正确的方式解释某事是胡说八道吗?该标准讨论了转换单元和odr与内联的结合使用。安德烈怎么会太聪明了?这里引用§3.2/3一个内联函数应该在odr使用的每个翻译单元中定义。@Edward Bird:不,它没有。您得到的未定义引用正是:g++不同意您的意见,也同意我的意见。在头文件中,我有一个函数,我已指定为内联函数。如果没有内联关键字,它可以很好地编译。爱德华·伯德:是的,这正是我要告诉你的。非内联函数必须在一个位置定义,并且只能在一个位置定义。这就是您通常将定义放入.cpp文件的原因。但内联函数必须在使用它的每个翻译单元的任何地方反复定义。这就是内联函数通常在头文件中定义的原因。换句话说,您不能通过添加/删除内联关键字在内联和非内联版本之间切换。每次切换时都必须重新组织代码。@EdwardBird,真的吗?试图用正确的方式解释某事是胡说八道吗?该标准讨论了转换单元和odr与内联的结合使用。安德烈怎么会太聪明了?这里引用§3.2/3,在使用odr的每个翻译单元中都应定义内联函数。