[英]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.