2012-11-16 52 views
1

我有以下代碼。爲什麼不能從初始化列表初始化我的類,即使它從std :: list派生?

#include <utility> 
#include <list> 
#include <iostream> 

class Pair: public std::pair<unsigned int, unsigned int>{ 
    Pair (unsigned int h, unsigned int l) : pair(h,l){}; 
}; 
class PairList: public std::list<Pair>{}; 


int main(int argc, char** argv){ 

    PairList pl = {{800,400},{800,400}}; 
} 

予編譯它使用V4.6的MinGW的克++用命令行
g++ -std=c++0x Test.cpp -o test.exe
和得到了錯誤:
error: could not convert '{{800, 400}, {800, 400}}' from '<brace-enclosed initializer list>' to 'PairList'
但是,如果在main()我寫
list<pair<unsigned int,unsigned int>> pl = {{800,400},{800,400}};
所有工作正常。
WTF?

+0

@ExplodingRat當編輯一個不好的標題時,它對簡單修復小的錯別字沒有多大幫助。建議編寫一個有意義的標題,而不要用完美的拼寫來獲得毫無價值的標題。 –

回答

6

有兩種方式:

  1. 不繼承從標準類,使用typedef代替:

    typedef std::pair<unsigned int, unsigned int> Pair; 
    typedef std::list<Pair> PairList; 
    
  2. 在你的繼承類實現正確的構造函數(以std::initializer_list爲參數),基類構造函數不能自動使用。

我推薦的第一選擇,爲標準類(除少數例外)都設計被繼承。

+0

1.如果我需要通過我自己的方法擴展基類(特別是對<>),該怎麼辦? 2.對不起,我實現了PairList的構造函數。查看我的問題 – OlegG

+0

@OlegG的更正我剛剛更新了我的答案,其構造函數需要能夠使用初始值設定項列表。 –

+0

@JoachimPielborg使用'std :: initializer_list'的解決方案對我來說看起來很難看。至少現在。 – OlegG