將只聲明但未定義的類的標識符用作模板參數和模板特化是有效的。是一個沒有定義作爲模板參數有效的類聲明
類似的東西:
template<typename T>
class NodeInfo;
template<typename T>
class GraphInfo;
template<typename T>
class Graph {
public:
GraphInfo<T> graphInfo;
NodeInfo<T> nodeInfo;
};
// specialisation
class ContextInfo;
template <>
class NodeInfo<ContextInfo> {
public:
int a, b, c;
};
template <>
class GraphInfo<ContextInfo> {
public:
int a, b, c;
};
int main() {
Graph<ContextInfo> g;
}
編譯沒有沒有GCC 7的任何警告,但我不知道這是否是做有效的事還是我創造某種與未定義行爲?
這是完全有效的。現在,如果模板嘗試使用其參數進行某些操作,那需要一個定義的類,那麼最終會出現編譯失敗,但只有在實例化模板時纔會出現。 –
除了完全有效之外,它也非常有用。您可以使用簡單的標籤來指定一個域。例如'座標'和'座標'。該標籤使這些類型不同,並且您不能錯誤地將其分配給另一個(造成圖形代碼中令人討厭的錯誤)。 –
StoryTeller
您的代碼不訪問任何類的任何成員,也不會調用任何成員函數。因此編譯器不需要知道你聲明的類的定義。做一些需要知道類定義的東西(例如訪問成員或調用成員函數),並且代碼不會被編譯。 – Peter