为什么我的模板类中的一些函数没有被编译
Why are some functions within my template class not getting compiled?
我正在使用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>!
}
相关文章:
- 跨模板化函数编译的静态变量
- 无法使用 LoadObject() 函数编译 UE4 Actor。
- 为什么在使用转换构造函数编译代码时需要 const 复制构造函数?
- 函数编译,即使它不接受整数
- 使用C 模板函数编译时间递归
- 安卓 JNI - 'raw'函数编译失败
- C++就地析构函数编译警告
- 对 TR1 使用 boost 时提升数学特殊函数编译错误
- 显式复制构造函数编译错误
- 使用SSE内部函数编译一个简单的c++程序
- 函数编译时错误
- 模板函数编译错误
- C++:使用类型名作为基的模板类调用函数编译时错误
- 将 MATLAB 函数编译成可以在 linux 终端上运行的东西,w.out MATLAB
- boost::绑定不要使用成员模板函数编译
- C++函数编译错误
- 加速模板函数编译
- 如何在C++中使用辅助函数编译以下flex文件
- 如何让g++使用move构造函数编译c++11代码
- 同时将一组函数编译为.LIB和.DLL