C++ 如果从未调用类模板的成员函数,是否不会实例化?
我刚开始了解一些模板基础知识。事实上,直到现在我才接受这一事实,但我真的不明白这一点被打破的原因:C++ 如果从未调用类模板的成员函数,是否不会实例化?,c++,templates,C++,Templates,我刚开始了解一些模板基础知识。事实上,直到现在我才接受这一事实,但我真的不明白这一点被打破的原因: template <typename T,bool hasFoo> struct Broken { void foobar(){ if (hasFoo){T::foo();} else { std::cout << "BROKEN" << std::endl;} } }; int main(){ Brok
template <typename T,bool hasFoo>
struct Broken {
void foobar(){
if (hasFoo){T::foo();}
else { std::cout << "BROKEN" << std::endl;}
}
};
int main(){
Broken<int,false> t;
t.foobar();
}
模板
结构破坏{
void foobar(){
if(hasFoo){T::foo();}
否则{std::cout
如果函数有效::foo()从未被调用,它就不会被实例化
是的,类模板的非虚拟成员函数在需要时才会实例化
根据标准:
(强调矿山)
实现不应隐式实例化函数
模板、变量模板、成员模板、非虚拟模板
成员函数,成员类,类的静态数据成员
模板,或constexpr if语句([stmt.if])的子语句,
除非需要这样的实例化
要回答标题中的问题,不,不需要调用它来实例化
此代码不编译,但从未调用foo
template <typename T>
struct Works {
void foo(){T::foo();}
void bar(){}
};
// this requires foo being instantiated because it may be called from
// elsewhere - the compiler cannot know.
template Works<int>;
int main(){
Works<int> t;
t.bar();
}
模板
结构工程{
void foo(){T::foo();}
无效条(){}
};
//这需要实例化foo,因为它可以从
//其他地方-编译器无法知道。
模板工程;
int main(){
工程技术;
t、 bar();
}
现场:
这就是为什么标准说它不实例化,除非它需要实例化,并且实例化的规则比是否调用更复杂。你会遇到什么错误?不仅仅是拼写(hasFoo
vshasFoo
),是吗?你自己解决过这个问题吗?你读过错误消息吗?有一些。@Axel请看我的PS。谢谢你指出错误typo@tobi303我修正了那个打字错误,但你(大概是意外地)对它进行了编辑。@skyking抱歉,我应该用更好的方式来表达这个问题。我希望我的PS能让它更清楚,这正是我想要的。也许你可以建议一个更好的标题,因为这个问题除了我之外,对任何人来说都是毫无用处的。很好……我真的想不出比这个更简短的“无效方法未在模板化类中实例化,但实例化方法中的布尔模板参数在编译时失败。”“正在使用”是一个蹩脚的短语。显式实例化不“使用”该词的一般含义(因此标准称“需要实例化”未“使用”)
template <typename T>
struct Works {
void foo(){T::foo();}
void bar(){}
};
// this requires foo being instantiated because it may be called from
// elsewhere - the compiler cannot know.
template Works<int>;
int main(){
Works<int> t;
t.bar();
}