gpt4 book ai didi

c++ - 为什么对模板化基类的函数调用不起作用?

转载 作者:搜寻专家 更新时间:2023-10-31 00:05:28 27 4
gpt4 key购买 nike

考虑以下示例:

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() 中失败,正确吗?

最佳答案

它会在 (2) 处失败,这是由标准保证的。在第 14.7.1/1 节中,它说实例化模板类不会实例化它的成员定义。只有在成员被使用后才会发生这种情况。

如果您从代码中删除 (2),它将编译。

14.7.1/1 excerpt:
The implicit instantiation of a class template specialization causes the implicit instantiation of the declarations, but not of the definitions or default arguments, of the class member functions, member classes, static data members and member templates; and it causes the implicit instantiation of the definitions of member anonymous unions.

强调我的。


Visual Studio 的诊断具有误导性。它会说 see reference to class template instantiation 'B<T>' being compiled .它的意思不是“我在实例化 B<T> 时失败了”,而是“我在实例化 B<T> 类的成员时失败了”

关于c++ - 为什么对模板化基类的函数调用不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2299523/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com