当前位置: 首页 > 知识库问答 >
问题:

类具有模板化的成员函数,是否为同一类?

颜欣怡
2023-03-14
struct Foo
{
    template <typename T> void f(T t) {};
};
std::vector<Foo> V;

V.push_back(Foo());
V.push_back(Foo());
V.push_back(Foo());
V.push_back(Foo());

下一个;让我们调用模板化成员函数的不同实例:

V.at(0).f<int>(1);
V.at(0).f<char>(2);
V.at(1).f<float>(3.4f);
V.at(2).f<double>(5.6);
V.at(3).f<long>(7);

最后是问题:

Foo类的所有实例都来自同一个类?看来答案是肯定的但是...第一个Foo实例的末尾有f成员函数的两个重载:

[0] Foo::f(int t);
[0] Foo::f(char t);
[1] Foo::f(float t);
[2] Foo::f(double t);
[3] Foo::f(long t);

共有1个答案

张权
2023-03-14

所有重载都是由foo::f成员函数的编译器生成的,您可以认为它已经手工编写了所有重载。

重载生成(模板实例化)不是基于实例的,而是基于类的,类本身会将所有模板实例化(就像在类主体中为给定的类型T编写所有不同类型的重载一样)

所以在你的例子中是这样的:

struct Foo 
{     
   template <typename T> void f(T t) {}; 
}; 
struct Foo 
{     
   void f<int>(int t) {}; 
   void f<char>(char t) {}; 
   void f<float>(float t) {}; 
   ...
   /// all the other uses of f with different types, anywhere in your code.
}; 
 类似资料:
  • 是否有人知道此显式特化是否有效: clang 主干 (12/3/2013) 给出以下错误: f:...\test.cpp:36:20: 错误: 从类 'O' 中出线定义 “Fun” 没有定义 1生成错误。 任何来自标准的支持参考来证明你的答案将不胜感激! 注意:我有点惊讶这是一个错误——我认为应该为任何以< code >开始实例化“Fun”的模板参数族选择专门化 这是一个叮当的错误还是我期望中的错

  • 我有一个模板化的C++类,它也有一个模板化的成员函数。这个成员函数的模板参数以特定的方式依赖于类的模板参数(请参阅下面的代码)。我正在为其模板参数的两个不同值实例化(而不是专门化)该类。一切都在这一点上进行。但是,如果我调用模板化的成员函数,对第一个实例化对象的调用只会编译,而不会编译第二个。似乎编译器没有为模板类的第二次实例化实例化模板化成员函数。我正在使用“g++filename.cpp”编译

  • 我有一个问题,我想在下面的代码中专门化模板类的模板成员函数。这个问题的答案是模板类成员函数的显式特化,这似乎表明它无法完成。这是正确的吗,如果是这样,我可以使用任何解决方法,以便在编译时通过内联inc函数进行扩展? 非常感谢! g吐槽道: test2.cpp:32:13: 错误: 非命名空间作用域中的显式专用化 'struct IdxIterator' test2.cpp:32:25: 错误: 非

  • 是否可以编写一个模板,根据是否在类上定义了某个成员函数来改变行为? 下面是我想写的一个简单的例子: 因此,如果定义了,那么它将使用它;否则就不会。我不知道怎么做的神奇部分是“function_exists”部分。

  • 和Sfinae有麻烦。我需要能够确定一个类型是否定义了成员函数运算符->,而不管它的返回类型如何。示例如下。 HasOperatorMemberAccessor无法找到PointX的成员函数“Object Operator->()Const”。因此它使用Test的通用版本测试(...)。 但是,HasOperatorMemberAccessorOBJECT能够找到PointX的“Object Op

  • [dcl.spec.auto]/14国[强调我的]: 显式实例化声明不会导致使用占位符类型声明的实体的实例化,但也不会阻止根据需要对该实体进行实例化以确定其类型。[示例: -结束示例] 和[temp.explicat]/11声明[强调我的]: 现在,考虑我们是否在类模板中的friend声明中定义了friend函数: 如果在同一翻译单元中实例化了的多个专门化,则将违反[basic.def.odr]/