C++ 模板类的默认参数是否实例化模板?
模板的以下默认参数是否实例化了类型为C++ 模板类的默认参数是否实例化模板?,c++,templates,default-arguments,template-instantiation,C++,Templates,Default Arguments,Template Instantiation,模板的以下默认参数是否实例化了类型为EmptyClass的模板 class EmptyClass{}; template <typename TYPE=EmptyClass> class Sample { public: static void test() { TYPE::Serialize(); } }; 类EmptyClass{}; 样板 类样本 { 公众: 静态孔隙试验() { 类型::序列化(); } }; 否,在该代码中创建了E
EmptyClass
的模板
class EmptyClass{};
template <typename TYPE=EmptyClass>
class Sample
{
public:
static void test()
{
TYPE::Serialize();
}
};
类EmptyClass{};
样板
类样本
{
公众:
静态孔隙试验()
{
类型::序列化();
}
};
否,在该代码中创建了EmptyClass的任何实例。Serialize是一个静态函数。EmptyClass的构造函数从未被调用(在代码中显示)否。模板在使用时被实例化,并且在每个函数的基础上被实例化
默认参数值只是未指定参数时要使用的类型。但这本身并不意味着使用
调用Sample::test()
时,将实例化Sample::test()
,并尝试调用EmptyClass::serialize()
导致编译时错误(因为EmptyClass
被声明为没有此函数)
尝试构造更多的函数,包含不同的编译时错误,引用不同的参数,您将看到,在函数未被使用之前,如何不产生错误 只有当你声明了一个实例化的时候。这并没有给我任何编译错误。这意味着,它实际上并没有实例化模板。但是我在C++11标准中找不到任何一行关于实例化的内容。对于模板,在实际使用模板之前,不会实例化任何内容。拥有
静态
成员函数是不同的,因为它们不适用于实例。我怀疑的是。上述代码是否实例化了一个类型为EmptyClass
的模板?实际上我不确定,但是添加一行typedef示例不起作用代码>应创建编译器错误。问题不在于构造函数和对象。它是关于模板实例化的。模板的状态不是类的实例,而是类模板的实例。所以我不明白你的回答和这个问题有什么关系。我无法理解为什么这个“答案”被排除在外。。。