我有以下類模板:
template<typename T=class idType, typename U=class uType>
class f {
std::unordered_map<T::Type, float> id_; // error!
}
我正在使用依賴注入框架boost::di,因此我需要命名我的模板引數才能將這些模板系結到實際型別。當我嘗試使用模板的基礎型別宣告哈希圖時,我得到一個錯誤,這讓我很驚訝idType。是的,如果我使用的模板引數沒有定義 a ,我會想象一個錯誤Type,但我當然會這樣做。它們是在我包含包含上述示例的檔案之后定義的。
錯誤是:
error: invalid use of incomplete type ‘class idType’
14 | std::unordered_map<typename T::Type, float> rpc;
| ^~~
example.hpp:9:29: note: forward declaration of ‘class idType’
9 | template<typename T = class idType, typename U = class uType>
uj5u.com熱心網友回復:
它們是在我包含包含上述示例的檔案之后定義的
是的,那是行不通的。
雖然模板和類定義確實有一些特定的余地,因為它們有時可以參考在它們之后宣告/定義的東西,但這些都是非常具體的情況。類成員函式的主體可以參考它們自己的類中尚未宣告的其他元素(本質上,編譯器將成員函式定義移動到類定義之后)。
并且模板可以參考尚未定義的名稱......只要這些名稱依賴于模板引數。
您提供的代碼使用idType,它不是模板引數名稱。引數是T;_ idType只是該引數的默認值。如果用戶提供了不同的型別,您的使用idType將忽略它。
idType因此,編譯器必須在模板內的使用點進行搜索,而不是在實體化時進行搜索。
實際上,您將idType其用作默認值這一事實也要求型別需要存在于模板定義的位置。畢竟,您命名了它;如果你命名它,它需要存在。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/433960.html
下一篇:使用模板在C 中復制建構式的問題
