gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 16:36:23 25 4
gpt4 key购买 nike

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

函数如下:

void remove(ID id)
{
sdfgsdfg456456456456sfdsdf
}

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

有解决办法吗?如果我在 .cpp 文件中实现该功能,是否会发生同样的事情?

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

最佳答案

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

更正式地说,标准的第 14.7.1 节(强调我的):

The implicit instantiation of a class template specialization causes the implicit instantiation of the declarations, but not the definitions or default arguments, of the class member functions

稍后在同一部分:

An implementation shall not implicitly instantiate a function template, a member template, a non-virtual member function, a member class, or a static data member of a class template that does not require instantiation.

(“隐式”一词在这里很关键;如果您使用 explicit template instantiation ,编译器将立即尝试使用指定类型实例化所有成员,如果有任何成员未编译则失败)

这不仅仅是一个优化;您可以利用此行为来实例化具有仅支持模板操作子集的类型的类模板。例如,假设您编写了一个模板类,它将与支持 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>!
}

关于c++ - 为什么我的模板类中的一些函数没有被编译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23679525/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com