Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.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++;?_C++_Templates_Static_Member - Fatal编程技术网

C++ 模板成员函数如何在c++;?

C++ 模板成员函数如何在c++;?,c++,templates,static,member,C++,Templates,Static,Member,我想知道模板成员函数是如何工作的。特别是,当模板成员函数实例化时,是否重新定义了整个类?我的困惑来自这样一个事实(如果我是对的话),即模板类不是正确意义上的类。i、 例如,当实例化时,编译器为一个全新的类创建定义。模板函数也是如此。然而,带有模板函数的类似乎是实际的类,所以我不确定它们如何工作。因此,我想知道,在实例化一个模板成员函数之后,类定义会发生什么?此外,如果我将带有模板成员函数的类传递给模板类,我可以使用模板成员函数吗?这会引起问题吗?我试过一次,但出现了一个错误,即多次定义了多个函数

我想知道模板成员函数是如何工作的。特别是,当模板成员函数实例化时,是否重新定义了整个类?我的困惑来自这样一个事实(如果我是对的话),即模板类不是正确意义上的类。i、 例如,当实例化时,编译器为一个全新的类创建定义。模板函数也是如此。然而,带有模板函数的类似乎是实际的类,所以我不确定它们如何工作。因此,我想知道,在实例化一个模板成员函数之后,类定义会发生什么?此外,如果我将带有模板成员函数的类传递给模板类,我可以使用模板成员函数吗?这会引起问题吗?我试过一次,但出现了一个错误,即多次定义了多个函数,尽管我不确定这是错误的原因还是其他原因。使用静态模板成员函数时是否还有其他警告?

类定义保持原样;模板函数所做的就是为该类生成一系列成员函数。例如:

class A {
    public:
        template<typename T> foo (T &t);
}
…只是更方便。在最后一个例子中,你不会期望为每个函数创建一个新类吧


也许这种混淆来自于函数在某种程度上是类内存布局的一部分的概念;每个函数本身都包含在类中,并且在创建类的对象时都会在内存中的某个位置实例化。这种观点是错误的。函数(模板函数、全局函数、成员函数、lambda函数或其他函数)从未动态创建或在内存中复制;它们是可执行映像的静态和不变部分。该类的内存布局不会因存在一组额外的函数而改变,即使这些函数碰巧是由模板成员生成的。

在实例化一个类时,模板类定义将被实例化。它的每个成员函数在使用时都会实例化。这实际上允许您拥有在使用某些类型而不是其他类型实例化类时调用的成员函数。但是,您必须确保函数的签名在语法上是可行的,或者在SFINAE中失败。它将在解析的第一阶段查找。如果函数本身不是模板,则会检查主体的名称查找……因此必须通过typename标记从属名称。

模板的专门化,无论是类模板还是函数模板,在翻译单元中首次使用时都会实例化。类可以有成员模板(类模板和函数模板),类模板也可以。此外,类模板的成员函数本身就是隐式函数模板。请注意,模板从不实例化。只有模板的专门化才能被实例化。非常好,谢谢。“模板类不是正确意义上的类”你的困惑来自于称它们为“模板类”。它们是类模板。它们不是类,而是用来生成类的模板。我的编译器使用精灵魔法。示例中似乎缺少一些强大的类型化概念。使用带有类型的模板生成新类型,其中您的
foo
可能具有
A*x=newa(true)
A*y=新的A(123)
x
y
结束时相同type@infixed“foo”不是构造函数,因此示例代码不适用。问题是关于带有模板成员函数的非模板类。没有创建新类型。我认为这不太正确。没有所谓的“模板类定义”。有一个类模板定义,但从未实例化。只实例化模板的专门化。此外,专门化不是每次使用时都实例化,而是第一次(在每个翻译单元内)使用时才实例化。
class A {
    public:
        foo (bool &t);
        foo (int &t);
        foo (double &t);
}