2016-06-22 11 views
1

Ich habe den folgenden Code:Constructor, die nulltpr_t nimmt: Funktionsdefinition keine Parameter deklarieren

class C { 
private: 
    void *data; 

public: 
    constexpr C(nullptr_t) : data(nullptr) { } 
    C(int i) : data(new int(i)) { } 
}; 

ich einen Konstruktor erstellt haben, die nullptr_t nimmt, so dass ich Code wie folgt haben:

C foo(2); 
// ... 
foo = nullptr; 

-Code ähnlich wie dies funktioniert hat zuvor auf MSVC jedoch dieser Code nicht auf GCC 5.3.1 (mit -std=c++14) mit auf der schließenden Klammer des C(nullptr_t) mit error: function definition does not declare parameters kompilieren. Auch wenn ich dem Parameter einen Namen gebe (in diesem Fall _), bekomme ich error: expected ')' before '_'. Dies schlägt auch fehl, wenn das Schlüsselwort constexpr entfernt wird.

Warum kann ich einen solchen Konstruktor nicht deklarieren, und was sind mögliche Problemumgehungen?

+1

Sie sollten '# include 'mindestens. (Und fügen Sie 'std ::'.) – songyuanyao

+0

@songyuanyao danke, das hat es behoben. –

Antwort

1

Sie müssen ein Fan von "using namespace std", und Sie just got tripped up by it:

constexpr C(std::nullptr_t) : data(nullptr) { } 

gcc 5.3.1 kompiliert diese, auf --std=c++14 Konformitätsstufe:

[[email protected] tmp]$ cat t.C 
#include <iostream> 

class C { 
private: 
    void *data; 

public: 
    constexpr C(std::nullptr_t) : data(nullptr) { } 
    C(int i) : data(new int(i)) { } 
}; 
[[email protected] tmp]$ g++ -g -c --std=c++14 -o t.o t.C 
[[email protected] tmp]$ g++ --version 
g++ (GCC) 5.3.1 20160406 (Red Hat 5.3.1-6) 
Copyright (C) 2015 Free Software Foundation, Inc. 
This is free software; see the source for copying conditions. There is NO 
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 
+0

Ich habe es gerade versucht, und es ist immer noch mit dem gleichen Fehler fehlgeschlagen. Spezifizieren Sie zusätzliche Flags für g ++? cpp.sh zeigt es auch: http://cpp.sh/7ldzs –

+0

Nein, keine zusätzlichen Parameter. Ich habe meine Antwort aktualisiert, um das zu dokumentieren. –

+1

Ah, ich sehe es jetzt, ich habe nichts hinzugefügt, also '' wurde nicht aufgenommen. –

Verwandte Themen