【发布时间】:2016-04-04 19:09:49
【问题描述】:
template <typename T>
void func(){
T* t = new T();
t->do_something();
...
}
在这种情况下,编译器如何知道 typename T 将定义一个方法 do_something() 呢?在 Java 中,我们可以指定泛型类扩展什么接口,但 C++ 显然没有相同的语法。那么如果我们调用func<AClassThatDoesntHaveDoSomethingDefined>()会发生什么呢?
【问题讨论】:
-
@MateenUlhaq 不。我不是在问如何在模板上添加约束。我更好奇为什么 C++ 允许编译这样的代码,以及它如何处理未定义被调用函数的情况。
-
@OneZero 该语言的规则是,在模板实例化之前,很少进行检查。但是,一旦模板被实例化 - 有足够的信息可以知道存在问题,不是吗?
-
嗯,扩展一个类(在 Java 中)更像是派生自一个 C++ 中的类。它与模板无关。