2014-10-01 31 views
4

我只是遇到了以下問題:不能調用基類的構造函數與括號初始化智能感知錯誤

#include "stdafx.h" 
#include <string> 
#include <iostream> 

class transaction{ 
protected: 
    transaction(const std::string& log) { printLog(log); } 
private: 
    void printLog(const std::string& log) const { std::cout << log << "\n"; } 
}; 

class inTrans : public transaction { 
public: 
    inTrans() : transaction(std::string("input")) { } 
}; 

class outTrans : public transaction { 
public: 
    outTrans() : transaction{ std::string("output") } { } //This doesn't work 
}; 

的Visual Studio 2013,標誌着第一個「{」 - 紅色,並顯示以下錯誤:

"Error protected function "transaction::transaction(const std::string &log)" (declared at line 7) is not accessible through a "transaction" pointer or object."

事情是,我仍然能夠編譯文件,一切似乎都運行得很好。 那麼,爲什麼我會得到這個奇怪的錯誤?

+0

是不是故意的,你使用()用於INTRANS和{}爲outTrans初始化列表?也許C++ 11支持初始化列表的一些{}幻想,我不知道。 – 2014-10-01 14:10:00

+1

你的代碼可以用GCC編譯。也許在Visual Studio中有bug /缺少功能? – 5gon12eder 2014-10-01 14:11:58

+0

gcc和clang可以正常工作。聽起來像一個錯誤。 「 – 2014-10-01 14:13:46

回答

4

如果我們看看草案C++標準節12.6.2初始化基地和成員語法表明你有什麼是有效的語法,這樣的錯誤是一個錯誤:

ctor-initializer: 
    : mem-initializer-list 
mem-initializer-list: 
    mem-initializer ...opt 
    mem-initializer , mem-initializer-list ...opt 
mem-initializer: 
    mem-initializer-id (expression-listopt) 
    mem-initializer-id braced-init-list <-- this applies to this case 

代碼還編譯罰款都gccclang

0

我注意到你失敗的代碼使用大括號而不是括號將字符串傳遞給基礎構造函數。我可能不會在一段時間內完成C++,但這對我來說似乎是錯誤的。

transaction { std::string("output") } 
      ^     ^

應該

transaction (std::string("output")) 
      ^     ^
+0

個人,我認爲[wikipedia article here](http://en.wikipedia.org/wiki/C%2B%2B11)是C++ 11重要特性的一個很好的總結 - 一個很好的介紹。我有點需要了解更多關於位的信息,而不需要尋求一個好的總體參考,所以不確定實際去哪裏。 – 2014-10-07 02:29:26