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

在派生类中专门化模板成员

程吕恭
2023-03-14

这里有一个最小的例子来说明我遇到的问题。

#include <iostream>

struct A {
  template <int i>
  void dosomething();

  void show();
};

template<>
void A::dosomething<0>()
{
  std::cout << "0 in A" << std::endl;
}

void A::show()
{
  dosomething<0>();
}

struct B : A {
  // Without the following declaration:
  // error: template-id ‘dosomething<1>’ for ‘void B::dosomething()’
  // does not match any template declaration
  template <int i>
  void dosomething();
};

template<>
void B::dosomething<1>()
{
  std::cout << "1 in B" << std::endl;
}

int main()
{
  A x;
  x.dosomething<0>();

  B y;
  y.dosomething<0>(); // Link error!
  y.show();
  y.dosomething<1>();

  return 0;
}

模板成员A::doSomething()显式专用于基类中的i=0。模板的代码是显式生成的,并在成员A::show()中调用。

我发现的第一个问题是:

template <int i>
void dosomething();
template-id ‘dosomething<1>’ for ‘void B::dosomething()’
does not match any template declaration.
undefined reference to `void B::dosomething<0>()'

该错误是由于在main中调用y.doSomething<0>()造成的。可以通过调用Y.A::DoSomething<0>()来避免这种情况。为什么doSomething<0>()b的实例中显然是不可见的?

共有1个答案

谯阳伯
2023-03-14

当对成员函数进行脱节定义时,将在::运算符之前引用的类中查找该函数的声明。

考虑一下:

struct C { void test(); };
struct D : C { };

void D::test() { }; // error, test is not a member of D but of C

这和做

template<> void B::dosomething<1>() 
{ }
 类似资料:
  • 我有一个模板函数doSomething(T),它接受任何类型的参数…类型基类除外。 所以我把doSomething模板专门用于类型Base的参数,所以它做了一些不同的事情。 然而,当我将派生类传递给doSomething时,它会打印“所有类型!”,而我希望它打印“Base!”,因为派生类本质上也是一个基类。 如果我有: 然后doSomething(d)也会打印“所有类型!”而不是“base!”,因

  • 还尝试在专门化的中进行模板方法专门化: 这一次它编译,但调用原始方法,即 解决方案

  • 我有以下模板方法: 但是我得到了那些奇怪的链接错误: /usr/lib/gcc/x86_64-redhat-linux/4.4。7/../../../../包括/c/4.4。7/例外:62:void MyStruct::readField(std::basic_istream)的多重定义 如何专门化此成员函数? 编辑 这种方法在以下方面起作用: 或者使用s或在类外使用

  • 关于下一个代码,我有一些问题: > 类专业化

  • 我有一个通用算法,需要访问其模板类型的特征。有一个特征类可以专门用于提供这些特征。 在我的类中使用此算法时,我想将其与类中定义的私有类型一起使用。 然而,专门化只能发生在或全局范围内,而我的类是不可访问的。 是否有可能以某种方式专门化具有私有类型的模板,至少在可访问此类型的范围内? 也许可以将这个专门化声明为一个类?