Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.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++_Templates - Fatal编程技术网

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();
}