2015-09-15 50 views
4

考慮下面的代碼:std :: ofstream == NULL不會編譯爲-std = gnu ++ 11,任何解決方法?

std::ostream file; 
if(file == NULL) std::cout << "Failed to open file" << std::endl; 

(來自GCC 5.2默認)經過時-std = gnu11,或者僅僅使用
gcc code.cpp -o a.out它編譯完美。

它失敗-std = GNU + 11,雖然:

no match for ‘operator==’ (operand types are ‘std::ofstream {aka std::basic_ofstream<char>}’ and ‘long int’)` 

什麼是最簡單的解決方法嗎?

詳情:

我必須使用std = GNU ++ 11有機會獲得shared_ptr定義。此外,我的一些代碼會自動生成,修改生成器會產生合理的努力 - 所以我想知道是否有人可以想出更簡單的方法來擺脫這種「缺乏兼容性」。

+4

'如果性病::法院<< 「失敗」(文件!);'' – Pixelchemist

+0

-std = gnu11'是AC標誌 – user3528438

+0

'如果(文件== nullptr)' –

回答

18

爲什麼這個編譯在第一位的唯一原因是因爲std::ios,其中ofstream派生自於,提供了一個非明確的(!)operator void*之前的C + + 11。從C++ 11開始,提供了explicit operator bool,而不允許根據代碼的需要進行隱式轉換。相反,寫

if (!file) std::cout << "Failed to open file" << std::endl; 
+0

這很有用。我想知道是否會有某種標誌或者定義我可以放在GCC命令行中,以使這個缺失的「operator ==」再次可見,這樣我就不必經歷我所有的源代碼碼。 – rkioji

+2

我認爲代碼「開始」是錯誤的。一個ofstream不是一個指針(當然,它可以轉換爲一個指針),因此不應該把它當作指針來對待。 –

+0

另外,由於它可以隱式轉換爲bool,所以你可以編寫像'int foo = file;'這樣的糟糕的東西,它會很高興地編譯。 –

相關問題