Jos*_*man 5 c++ templates sfinae
这个问题是一个对立点:为什么未调用的模板类成员没有实例化?,作者对某些模板方法没有实例化感到惊讶.
我有相反的问题:当我不期望它们时,我的部分功能正在实例化.参加以下计划:
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;
}
Run Code Online (Sandbox Code Playgroud)
此程序无法编译错误:
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;
Run Code Online (Sandbox Code Playgroud)
但是为什么它试图实例化一个我没有调用的函数的参数?它是一个带有模板参数的模板函数,它无法知道,这使得它实例化函数参数类型变得更加奇怪.
为什么这样做?为什么SFINAE在这里没有帮助我,最坏的情况是不考虑过载?
创建模板类的实例时,需要完整定义该类。这包括成员函数声明。如果成员函数声明之一未完全定义,则类本身也未完全定义。
在这种情况下,没有定义,因此无法完全声明Foo<T>::X该Baz函数,并且整个类也没有完全定义。