【发布时间】:2010-02-19 21:00:20
【问题描述】:
考虑以下示例:
template <typename T>
class A {
public:
void f() {
cout << "A::f()\n";
}
};
template<>
class A<int> {
};
template<typename T>
class B: public A<T> {
public:
void g() {
cout << "B::g()\n";
A<T>::f();
}
};
int main() {
B<int> b; // (1)
b.g(); // (2)
return 0;
}
显然,对于 int 模板类型,在 B::g() 中对 A::f() 的调用将失败。我的问题是通话在什么时候失败?在(1)或(2)处?我认为它应该是(1),因为此时编译器会创建一个模板类型为 int 的新类并对其进行编译。该编译应该在 f() 中失败,对吗?
【问题讨论】:
-
@John:没有,因为编译会失败。
-
哦,好的。我很困惑,因为你在谈论“调用在什么时候失败”——并在代码中注释了一些点——就好像它已经编译了一样。