簡體   English   中英

無法在初始化時轉換Type

[英]Cannot convert Type in initialization

我想我錯過了什么,我不知道到底是什么。 我們來看看代碼片段。

template <typename T>
struct Foo { 
    Foo (int n, int p, string s, T t = {})
    : m_n {n}, m_p {p}, m_s {s}, m_t {t}
    {}

    const int m_n;
    const int m_p;
    const string m_s;
    T m_t;
};

用法如下:

Foo<int> f_int1 {1, 2, "A", 155};
Foo<int> f_int2 {1, 2, "A"};

一切都像預期的那樣。 但是當我想將用戶定義的類型作為Foo的T參數時,會發生一些錯誤。 考慮:

struct Boo {
    int z;
    int l;
};

用法:

Foo<Boo> f_boo1 {1, 2, "A"};
Foo<Boo> f_boo2 {1, 2, "A", {1, 2}};

這兩條指令都給出了(gcc 4.8.1):

cannot convert ‘Boo’ to ‘int’ in initialization

我可以像這樣創建Boo對象:

Boo boo1 {};
Boo boo2 {1, 2};

那么,你能告訴我問題出在哪里嗎?

可能的方法:

struct Boo {
    Boo () : z {}, l {} {}
    Boo (int p1, int p2) : z {p1}, l {p2} {}

    int z;
    int l;
};

以下說明均按預期工作:

Foo<Boo> f_boo1 {1, 2, "A"};
Foo<Boo> f_boo2 {1, 2, "A", {1, 2}};

對我來說,沒關系,我沒有看到任何理由為什么不在課堂上添加兩個構造函數,但是如果類型不是我的呢? 我應該用構造函數編寫簡單的包裝器嗎?

謝謝,阿圖爾

那是因為你試圖在Boo上執行聚合初始化。 見§8.5.4/ 3:

列表初始化對象或類型T引用定義如下:

- 如果T是聚合,則執行聚合初始化(8.5.1)。

你打算復制構造你的Boo ......但實際上你正在進行聚合初始化,這導致嘗試從Boo構造int z ,因此出錯

錯誤:沒有可行的從'Boo'到'int'的轉換

請注意,您可以用更少的代碼重復您的問題,而無需任何模板:

Boo b;
Boo b2{b}; // error

修復很簡單。 只是不要使用列表初始化:

template <typename T>
struct Foo { 
    Foo (int n, int p, string s, T t = {})
    : m_n {n}, m_p {p}, m_s {s}, m_t(t)
    //                           ^^^^^^
{};

暫無
暫無

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

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