C++ 模板类中的函数定义
通常,在头文件中声明一个成员函数并使用源文件来实现它。我对原因的理解是,函数实现将只驻留在一个翻译单元中,并且将仅链接到其他单元(没有重复的代码),它还允许分离接口和实现,并且消除了转发声明相互依赖的函数的需要 但是,模板中的成员函数依赖于模板参数,如果实现放在源文件中,则无法知道模板参数。但是,仍然可以在类之外定义这样的函数,但是它的主要参数不再适用 那么,哪一个更好C++ 模板类中的函数定义,c++,templates,C++,Templates,通常,在头文件中声明一个成员函数并使用源文件来实现它。我对原因的理解是,函数实现将只驻留在一个翻译单元中,并且将仅链接到其他单元(没有重复的代码),它还允许分离接口和实现,并且消除了转发声明相互依赖的函数的需要 但是,模板中的成员函数依赖于模板参数,如果实现放在源文件中,则无法知道模板参数。但是,仍然可以在类之外定义这样的函数,但是它的主要参数不再适用 那么,哪一个更好 template <class T> class A { T m() { retu
template <class T>
class A
{
T m()
{
return T();
}
};
模板
甲级
{
T m()
{
返回T();
}
};
或
模板
甲级
{
T m();
};
模板
T A::m()
{
返回T();
}
如果这两段代码是内联的ta::m()
,那么这两段代码是等价的,但是没有它有什么区别吗?如果函数是虚拟的呢?这只是编码风格的问题,还是它有不同的语义?如果函数足够大,它会防止重复代码吗?或者如果它不会带来任何好处,编译器是否足够聪明,不会内联它
如果这两段代码是内联的ta::m()
,那么这两段代码是等价的,但是没有它有什么区别吗
不是针对模板,成员函数隐式地内联
,用于类定义的内部和外部
如果函数是虚拟的呢
没什么区别
这只是编码风格的问题,还是它有不同的语义
主要是风格上的。但是,它会影响名称查找的工作方式。如果我们要修改一下类定义
template <class T>
class A
{
using foo = T;
foo m();
};
模板
甲级
{
使用foo=T;
foom();
};
我们无法将外部成员定义为
template <class T>
foo A<T>::m()
{
return T();
}
模板
fooa::m()
{
返回T();
}
因为foo
的查找直到限定A::
之后才在类定义中发生。我们需要完全限定foo
本身,比如typename A::foo
。或者使用尾随返回类型
如果函数足够大,它会防止重复代码吗?或者如果它不会带来任何好处,编译器是否足够聪明,不会内联它
这两种风格都不应该对它产生消极或积极的影响。两者都受到实施质量问题的制约。当然,不同的实现可能有不同的质量。类成员函数不需要
inline
关键字。是否使用模板。@user9212993我不是暗示它是。那么,为什么您要提到它呢?@user9212993-如果您在同一个标头中提供类外内联定义,则对于非模板类来说是必要的。@VTT-这与标头的分隔无关,但与ODR冲突有关。
template <class T>
foo A<T>::m()
{
return T();
}