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
vs
hasFoo
),是吗?你自己解决过这个问题吗?你读过错误消息吗?有一些。@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();
}