为什么我的模板类中的某些函数没有被编译? 我正在使用VS Express 2013试图编译一个C++项目。我创建了一个带有一些函数的模板类。该类及其函数都位于一个头文件中。我包括了这个文件,我使用了这个类,我从中调用了函数,尽管visual studio不会编译我没有使用的类的函数。我已经关闭了所有的优化。我是否必须使用我编写的函数来查看它是否编译

为什么我的模板类中的某些函数没有被编译? 我正在使用VS Express 2013试图编译一个C++项目。我创建了一个带有一些函数的模板类。该类及其函数都位于一个头文件中。我包括了这个文件,我使用了这个类,我从中调用了函数,尽管visual studio不会编译我没有使用的类的函数。我已经关闭了所有的优化。我是否必须使用我编写的函数来查看它是否编译,c++,visual-studio,templates,visual-studio-2013,C++,Visual Studio,Templates,Visual Studio 2013,以下是函数: void remove(ID id) { sdfgsdfg456456456456sfdsdf } 该函数不应编译。事实上,如果我使用这个函数,项目将不会编译,但是如果我不使用这个函数,项目将编译,即使我使用这个类中的其他函数 这有解决办法吗?如果在.cpp文件中实现该函数,是否会发生同样的情况 编辑:我忘了提到它是一个模板类。我在中添加了该信息。如注释所示,发生这种情况的原因是remove()是类模板中的函数。编译器仅在实际使用时实例化模板代码;如果不调用remove(

以下是函数:

void remove(ID id)
{
    sdfgsdfg456456456456sfdsdf
}
该函数不应编译。事实上,如果我使用这个函数,项目将不会编译,但是如果我不使用这个函数,项目将编译,即使我使用这个类中的其他函数

这有解决办法吗?如果在.cpp文件中实现该函数,是否会发生同样的情况


编辑:我忘了提到它是一个模板类。我在中添加了该信息。

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

更正式地说,《标准》第14.7.1条规定(重点):

类模板专门化的隐式实例化会导致 声明的隐式实例化,但不是 类成员函数的定义或默认参数

稍后在同一节中:

实现不应隐式实例化函数 模板、成员模板、非虚拟成员函数、成员 类或类模板的静态数据成员 需要实例化

(此处“implicit”一词是关键;如果使用,编译器将立即尝试使用指定类型实例化所有成员,如果任何成员未编译,则会失败)

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

template<typename T>
class Foo
{
private:
   T _myT;

public:
   void bar()
   {
      _myT.bar();
   }

   void baz()
   {
      _myT.baz();
   }
};
这将很好地编译和运行:

void f()
{
   Foo<BarAndBaz> foo1;
   foo1.bar();
   foo1.baz();

   Foo<BarOnly> foo2;
   foo2.bar();
   // don't try foo2.baz()!
   // or template class Foo<BarOnly>!
}
void f()
{
富富1;
foo1.bar();
foo1.baz();
富富2;
foo2.bar();
//不要尝试foo2.baz()!
//或者模板类Foo!
}

您是在调试配置中编译,还是在发布配置中编译?在发布配置中。在调试配置中编译时是否会发生同样的情况?这就是答案;模板代码不会实例化,除非有东西实际引用它。显然,当你实例化一个模板类时,它只实例化你使用的成员函数(我可以复制这个)。@user1594138请更新你的问题以反映现实。在这方面,模板函数的工作方式与普通函数非常不同。您还应该非常清楚您的代码位于哪个文件中,因此毫无疑问您的代码是否分布在多个文件中,以及代码是否位于您实际使用/包含的头文件中。可能值得一提的是显式实例化,它将立即尝试实例化所有成员函数。语法是
模板类Foo@MooingDuck,这看起来确实是一个值得添加的内容;编辑
void f()
{
   Foo<BarAndBaz> foo1;
   foo1.bar();
   foo1.baz();

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