template <typename T>
void func(){
T* t = new T();
t->do_something();
...
}
在這種情況下,編譯器如何知道typename T會在其上定義一個方法do_something()
?在Java中,我們可以指定泛型類擴展的接口,但C++顯然不具有相同的語法。那麼如果我們撥打func<AClassThatDoesntHaveDoSomethingDefined>()
會發生什麼?C++如何知道模板類在編譯時支持哪些方法?
可能的重複:http://stackoverflow.com/q/122316/365102,http://stackoverflow.com/a/15671344/365102 –
@MateenUlhaq號我不問如何在模板上添加約束。我更好奇爲什麼C++允許這樣的代碼編譯,以及在未定義被調用的函數時如何處理這種情況。 – OneZero
@OneZero語言的規則是,除非實例化模板,否則很少進行檢查。然而,一旦模板被實例化 - 有足夠的信息知道存在問題,不是? –