簡體   English   中英

函數重載時的Typedef編譯錯誤

[英]Typedef compilation error on function overload

為什么我不能在程序2工作正常時編譯程序1? 為什么它的行為不同?

計划1:

#include <iostream>
typedef int s1;
typedef int s2;

void print(s1 a){ std::cout << "s1\n"; }
void print(s2 a){ std::cout << "s2\n"; }

int main() {
        s1 a;
        s2 b;

        print(a);
        print(b);

        return 0;
}

計划2:

#include <iostream>
typedef struct{int a;} s1;
typedef struct{int a;} s2;

void print(s1 a){ std::cout << "s1\n"; }
void print(s2 a){ std::cout << "s2\n"; }
int main() {
        s1 a;
        s2 b;

        print(a);
        print(b);

        return 0;
}

這是從模板類重現的錯誤,如何驗證兩個模板參數是否來自同一類型(在程序1的情況下)

Typedef不定義新類型,它們只是為現有類型創建別名。 在你的第一個程序中, s1s2都是int別名。 在你的第二個程序中,它們是兩個不同結構的別名,結構恰好相同。

您可以為這兩個結構指定名稱,這樣可以更清楚:

// Semantically identical to program 2
typedef struct a {int a;} s1;
typedef struct b {int a;} s2;

另一方面,如果你為同一類型制作別名,那么第二個程序將像第一個程序一樣失敗:

// Different from program 2. This will draw a compile error.
struct s {int a;};
typedef struct s s1;
typedef struct s s2;

int是一個基本類型:無論你在哪里使用它,它總是指向完全相同的東西 - 一個int

struct{int a;}不是基本類型 - 每次定義struct{int a;} ,都會創建一個新類型 - 因此在程序2的情況下,為什么s1s2被認為是不同的。

例如,請考慮以下事項:

typedef struct{int count;} apples;
typedef struct{int count;} airplanes;

蘋果和飛機是一樣的嗎? 可能不是。 但他們的數量都是數字計數。 因此為什么int是一致的但是structs不是 - int沒有與之相關的上下文,結構就是這樣。

typedef實際上並沒有創建任何新類型 - 它只在另一個名稱下別名一個類型。

因此,程序1和程序2之間的區別在於,在程序1中,您試圖定義函數的兩個版本(就編譯器而言)完全相同的簽名: print(int) 在程序2中,您定義了兩個不同的簽名: print([first struct type])print([second struct type])

不同之處在於,在程序1中, s1s2是相同類型的別名,而在程序2中,它們是不同的類型。 即使使用不同的類型名稱來生成該簽名,也無法使用相同的簽名定義函數的兩個重載。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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