有沒有簡單的方法來查看類是否已經在翻譯單元中實例化?從C++入門的練習要求每個標籤的語句,一個實例是否發生了:檢查類模板是否已實例化?
template <typename T> class Stack { };
void f1(Stack<char>); // (a)
class Exercise {
Stack<double> &rsd; // (b)
Stack<int> si; // (c)
};
int main() {
Stack<char> *sc; // (d)
f1(*sc); // (e)
int iObj = sizeof(Stack<string>); // (f)
}
我不知道我怎麼能真正把我對這些問題的答案。我想也許我可以爲每個類類型使用顯式實例(例如extern template class Stack<char>
),然後在程序中永遠不會有相應的顯式實例化定義。這樣,如果某個東西被實例化了,如果定義沒有出現,那麼鏈接器會引發一個錯誤。
然而,編譯器/連接並不總是承認這樣的錯誤:
template <typename T> class A{ };
extern template class A<int>;
int main(){
A<int> a;
}
這對編譯GCC 4.9.2罰款。但是,如果這是在我的程序唯一的目標文件應該是一個錯誤,據我可以從N3337的[14.7.2] [11]說:
If an entity is the subject of both an explicit instantiation declaration and an explicit instantiation definition in the same translation unit, the definition shall follow the declaration. An entity that is the subject of an explicit instantiation declaration and that is also used in a way that would otherwise cause an implicit instantiation (14.7.1) in the translation unit shall be the subject of an explicit instantiation definition somewhere in the program; otherwise the program is ill-formed, no diagnostic required.
(我猜「沒有診斷需要「是爲什麼這不會引發錯誤?)。另一種情況是,實例化發生在不完整的類類型對於表達式不可行的情況下 - 以便我可以通過刪除Stack
的定義來進行檢查?
template <typename T> class Stack;
因此,每個不完整類型的錯誤對應於一個實例化會發生的地方?
僅僅刪除'Stack'的定義對於任意情況是不夠的,因爲某些規則可以同時使用完整的類類型和不完整的類類型。如果他們有一個完整的班級類型,他們只是收集更多的信息。例如,ADL和運算符函數查找。但是在'sizeof'這樣的情況下,這應該足夠了。 –
'template struct always_false:std :: false_type {};'',然後''static_assert(always_false :: value,「如果發生這種情況,'Stack'被實例化');'Stack'的定義。 –
@ T.C。但是,這與「檢查」有什麼關係?這產生了一個嚴重的錯誤? (沒有讀過這個問題,只是標題) – Columbo