为什么我的模板类中的一些函数没有被编译

Why are some functions within my template class not getting compiled?

本文关键字:函数 编译 我的 为什么      更新时间:2023-10-16

我正在使用VS Express 2013试图编译一个c++项目。我已经创建了一个带有一些函数的模板类。类和它的函数都在一个头文件中。我已经包含了这个文件,我已经使用了这个类,我已经从它调用了函数,尽管visual studio不会编译我不使用的类的函数。我已经关闭了所有的优化。我是否必须使用我编写的函数来查看它是否编译?

函数如下:

void remove(ID id)
{
    sdfgsdfg456456456456sfdsdf
}

函数不应该编译。事实上,如果我使用这个函数,项目将不会编译,但如果我不使用这个函数,即使我使用这个类中的其他函数,项目也会编译。

这个问题有解决办法吗?如果我在.cpp文件中实现该函数,会发生同样的事情吗?

编辑:我忘了说它是一个模板类。我在

中添加了这些信息。

如注释所示,发生这种情况的原因是因为remove()是类模板中的函数。编译器只在模板代码被实际使用时实例化它;如果你不调用remove(),它可以有你想要的所有语法错误,没有人会抱怨。

更正式,§14.7.1的标准状态(强调我的):

类模板特化的隐式实例化导致声明的隐式实例化,而不是类成员函数

的定义或默认实参

在同一段后面:

实现不能隐式实例化函数非虚成员函数,成员类的静态数据成员或类模板的静态数据成员需要实例化。

("隐式"这个词在这里是关键;如果您使用显式模板实例化,编译器将立即尝试使用指定的类型实例化所有成员,如果没有编译则失败

这不仅仅是一个优化;您可以利用这种行为来实例化仅支持模板操作子集的类型的类模板。例如,假设您编写了一个模板类,该模板类将与支持bar()操作的类型一起使用,此外,有些类型还将支持baz()。你可以这样做:

template<typename T>
class Foo
{
private:
   T _myT;
public:
   void bar()
   {
      _myT.bar();
   }
   void baz()
   {
      _myT.baz();
   }
};

现在假设你也有这些:

struct BarAndBaz
{
   void bar() {}
   void baz() {}
};
struct BarOnly
{
   void bar() {}
};

这将编译和运行良好:

void f()
{
   Foo<BarAndBaz> foo1;
   foo1.bar();
   foo1.baz();
   Foo<BarOnly> foo2;
   foo2.bar();
   // don't try foo2.baz()!
   // or template class Foo<BarOnly>!
}