2015-03-08 150 views
1

我嘗試在Visual Studio 2013(社區版)中編譯一些代碼,但我遇到了問題:下面的代碼拒絕編譯。C++ 11委託構造函數和typedef

struct X 
{ 
    X(double y); 
}; 

typedef X Z; 
struct Y : public Z 
{ 
    using Z::Z;    
}; 

問題是使用Z :: Z的行。它給了我一個錯誤C2039:'Z':不是'X'的成員

此代碼是否有效?或者這是一個錯誤?

回答

5

您正在使用的功能是繼承的構造函數,而不是委託構造函數。根據MSDN,VS 2013 RTM不支持繼承構造函數。

VS 2013 確實支持委託構造函數,但這是一個不同的功能—一個構造函數委託成員初始化到另一個。這將是一個例子:

struct X 
{ 
    int i; 

    X(int i) : i(i) {} 

    X() : X(42) {} // delegating constructor 
}; 

如果需要繼承在編譯器構造不支持,你可以通過創建一個定義完美轉發構造秋毫一種解決方法。這是沒有100%相同的效果,但它應該是好的足以讓大多數的用途:

struct Y : X 
{ 
    template <class... Arg> 
    Y(Arg &&... arg) : X(std::forward<Arg>(arg)...) {} 
}; 

它不會有相同的noexcept特徵作爲基類構造函數(或多個),但話又說回來,VS 2013沒有按」支持noexcept

+0

感謝您的精度,現在我確切知道繼承和委託構造函數之間的區別。我正在使用VS 2013社區版,這是相當新的,它似乎支持inherting構造函數至少部分,因爲它的工作原理,如果Y派生自X類並繼承自X構造函數.... – Renaud 2015-03-09 08:00:10