2017-04-26 122 views
5

Base sınıfında saf bir sanal işlev yazmaya çalıştım ve bir tanımını kodunun içinde gösterildiği gibi kodun içinde gösterildiği gibi bir derleme hatası almam gerektiğini biliyorum, ama her şey iyi çalıştı. C++ 17 ile gelen yeni bir şey mi?C++ 17'de saf sanal işlev için gövde?

class Base { 
public: 
virtual void virtual_func() { std::cout << "This a virtual function from BASE" << std::endl; }; 
virtual void pure_func() = 0 { std::cout << "This a PURE virtual function from BASE" << std::endl; }; 
}; 

Teşekkür

saf sanal bir tanım ile birlikte kullanılamaz
+0

var "Ben bir derleme hatası alıyorum gerektiğini biliyorum" - neden? Saf sanal işlevleri uygulamak için tamamen yasal. –

+2

Standart buna izin vermez, ancak VS (veya daha doğrusu, Microsoft'un derleyicisi) yapar. Uygun olmak için, tanımı açıklamadan ayırmanız gerekir. –

+0

@Neil Butterworth Ben öyle düşünmüyorum. C++ 14'te derleyemez. http://ideone.com/EISKsp – javaLover

cevap

4

(Görsel stüdyo 2017 kullanılır). Bu C++ 11 doğru, ve C++ 14 içinde:

10,4/2: ...
[Not: bir fonksiyon bildirimi saf bir belirtici bir tanım hem sağlayamaz - son not] [Örnek: (bölüm 13.4/2 bu kez altında)

struct C { 
virtual void f() = 0 { }; // ill-formed 
}; 

aynı ifade C++ 17 (N4659) hala geçerlidir. derleyici bu kodu kabul edersek

Bu durumda, elbette bir hata (gcc 7.1 doesesn't)

+0

gibi tuhaflığı engelleme, evet, eski el AFAIR. +1 – snr

+1

FYI, bu hatayı Microsoft'a bildirdim: https://developercommunity.visualstudio.com/content/problem/187888/msvc-incorrectly-allows-pure-virtual-function-defi.html –

İlgili konular