c – 为什么未实例化的模板类成员*参数*被实例化?
发布时间:2020-12-16 05:07:04 所属栏目:百科 来源:网络整理
导读:这个问题与 Why uncalled template class members aren’t instantiated?相反:作者对于某些模板方法没有实例化感到惊讶. 我有相反的问题:当我不期望它们时,我的部分功能正在实例化.参加以下计划: template class T class Foo;template class Tclass Bar {
这个问题与
Why uncalled template class members aren’t instantiated?相反:作者对于某些模板方法没有实例化感到惊讶.
我有相反的问题:当我不期望它们时,我的部分功能正在实例化.参加以下计划: template <class T> class Foo; template <class T> class Bar { template <class U> void Baz(typename Foo<T>::X x) {} }; int main() { Bar<int> bar; } 此程序无法编译错误: test.cc:6:40: error: implicit instantiation of undefined template 'Foo<int>' template <class U> void Baz(typename Foo<T>::X x) {} ^ test.cc:10:12: note: in instantiation of template class 'Bar<int>' requested here Bar<int> bar; ^ test.cc:2:26: note: template is declared here template <class T> class Foo; 但是为什么它试图实例化一个我没有调用的函数的参数?它是一个带有模板参数的模板函数,它无法知道,这使得它实例化函数参数类型变得更加奇怪. 为什么这样做?为什么SFINAE在这里没有帮助我,最坏的情况是不考虑过载? 解决方法
在创建模板类的实例时,需要完全定义类.这包括成员函数声明.如果未完全定义其中一个成员函数声明,则该类本身未完全定义.
在这种情况下,没有Foo< T> :: X的定义,因此Baz函数不能被完全声明,并且整个类没有完全定义. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容