簡體   English   中英

如何使這些typedef起作用?

[英]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名稱在許多情況下是可以互換的,但是它們並非總是可互換的,例如,當它是一個類時,可以將類型稱為Aliceclass 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM