模板成员函数如何在c++中工作
How do template member functions work in c++?
我想知道模板成员函数是如何工作的。特别是,当存在模板成员函数的实例化时,是否重新定义了整个类?我的困惑来自这样一个事实:(如果我是对的)模板类不是正确意义上的类。即,当被实例化时,编译器为一个全新的类创建定义。模板函数也是如此。然而,带有template函数的类似乎是实际的类,所以我不确定它们是如何工作的。因此,我想知道,在实例化一个模板成员函数之后,类定义会发生什么?此外,如果我将带有模板成员函数的类传递给模板类,我可以使用模板成员函数吗?这会造成问题吗?我试过一次,但出现了一个错误,说有几个函数定义了不止一次,尽管我不确定这是原因还是我的错误可能有其他原因。在使用静态模板成员函数时,是否有任何进一步的警告?
类定义保持原样;template函数所做的就是为该类生成一系列成员函数。例如:
class A {
public:
template<typename T> foo (T &t);
}
在概念上与你写的没有什么不同:
class A {
public:
foo (bool &t);
foo (int &t);
foo (double &t);
}
只是更方便。在最后一个例子中,你不会期望为每个函数创建一个新的类,是吗?
也许这种混淆源于函数在某种程度上是类内存布局的一部分;每个函数本身都包含在类中,并且每当创建类的对象时,都会在内存中的某个位置实例化。这种观点是不正确的。函数(模板化的、全局的、成员的、lambda或其他)从来不会在运行中创建或在内存中复制;它们是可执行映像中静态且不变的部分。类的内存布局不会因为存在一组额外的函数而改变,即使这些函数恰好是由模板成员生成的。
当您实例化一个类时,会实例化模板类定义。它的每个成员函数在使用时都被实例化。这实际上允许您拥有成员函数,如果在使用某些类型而不是其他类型实例化类时调用这些成员函数,则这些成员函数将不起作用。但是,您必须确保函数的签名在语法上是可行的,或者在SFINAE中失败。它将在解析的第一阶段进行查找。如果函数本身不是一个模板,则将检查主体的名称查找。。。因此,依赖名称必须通过typename进行标记。
- QSqlquery prepare()和bindvalue()不工作
- 导入库可以跨dll版本工作吗
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++为线程工作动态地分割例程
- 为什么我的 std::ref 无法按预期工作?
- 布尔比较运算符是如何在C++中工作的
- SampleConsensusPrerejective(ext.RANSAC)是如何真正工作的
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- <<操作员在下面的行中工作
- 有人能解释一下为什么下界是这样工作的吗C++的
- ExtractIconEx:可以工作,但偶尔会崩溃
- C++中的memset函数工作不正常
- 当我在第一个循环中使用"auto"时,它工作正常,但是使用"int"它会给出错误,为什么?
- 链表c++插入,所有情况都已检查,但没有任何工作
- 为什么stream::忽略未按预期工作