[英]In C++, how can I make typedefs visible to every file in my project?
[英]How can I make these typedefs work?
這些行位於不同的頭文件中,並最終按以下順序包含在源文件中:
class Alice;
/* pointers to Alice declared here!! */
template<class T>
class Bob;
typedef Bob<int> Alice;
template<class T>
class Bob
{
};
VS2013 error C2371: 'Alice' : redefinition; different basic types
error C2371: 'Alice' : redefinition; different basic types
為什么這是一個錯誤? 有什么解決方法嗎?
聲明某些內容作為一個類和另一個類的typedef都是不正確的。 盡管類名和typedef名稱在許多情況下是可以互換的,但是它們並非總是可互換的,例如,當它是一個類時,可以將類型稱為Alice
或class Alice
(使用稱為elaborated-type-specifier )。但這如果Alice
是typedef名稱則無效。 該規則起源於C,在這里您只能使用elaborated-type-specifier,並且必須聲明一個單獨的typedef才能簡單地說Alice
。
區別很重要,因為類型具有“用於鏈接目的的名稱”,即用於名稱處理的名稱,這會影響鏈接器看到的符號。
如果一個文件僅看到typedef名稱Alice
並將其用作函數的錯誤名稱,例如void foo(Alice*)
則您將無法將該函數與其他對void foo(Bob<int>*)
引用鏈接起來即使它們應該具有相同的名稱。
因此,編譯器有必要區分typedef(僅是別名)和類型的“真實名稱”(即,用於鏈接的名稱)。
唯一的解決方法是正確聲明類型,以便在所有地方都使用Alice
作為typedef的聲明,即替換不真實的class Alice;
聲明:
template<class T> class Bob;
typedef Bob<int> Alice;
您可以使用繼承作為可能的解決方法:
class Alice;
Alice* a1;
template<typename T>
class Bob {};
class Alice : public Bob<int> {} ;
如果我認為這是正確的並且有陳述
Alice obj;
編譯器將如何解釋“ Alice”。 在符號表中將有2個條目:一個作為類,另一個作為模板。
這就是為什么它會出錯。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.