2016-12-04 5 views
1

Kompilieren Datei error_xxx_does_not_name_a_type.cpp, warum bekomme ich Fehler
error_xxx_does_not_name_a_type.cpp:5:28: error: ‘A’ in ‘struct std::pair<bool, int>’ does not name a type std::pair<bool, int> ::A::B::C::D::get_i()Fehler xxx in yyy Namen hat keinen Typ

// error_xxx_does_not_name_a_type.h 
#pragma once 
#include <utility> 

namespace A{ namespace B{ namespace C{ 
struct D 
{ 
    std::pair<bool, int> get_i(); 
    std::pair<bool, int> get_j(); 
    std::pair<bool, int> get_k(); 
    int get_l(); 
}; 
}}} 

und

// error_xxx_does_not_name_a_type.cpp 
#include "error_xxx_does_not_name_a_type.h" 

#if 1 // gives me the error 
std::pair<bool, int> ::A::B::C::D::get_i() 
{ return {true, 10}; } 
#endif 
// But none of the below do 
// missing :: 
std::pair<bool, int> A::B::C::D::get_j() 
{ return {true, 10}; } 
// trailing return type 
auto ::A::B::C::D::get_k()-> 
    std::pair<bool, int> 
{ return {true, 10}; } 
// return type int 
int ::A::B::C::D::get_l() 
{ return 10; } 

Ich habe mit g++ -Wall -Wextra -std=c++14 -c error_xxx_does_not_name_a_type.cpp zusammengestellt und auf g++ (Ubuntu 5.3.0-3ubuntu1~14.04) 5.3.0 20151204

+0

Überrascht, es gibt keinen hochgestimmten Betrogenen von diesem. –

Antwort

2

Da   (Leerzeichen) ir relevant in diesem Zusammenhang und :: wird als Scope-Auflösung-Operator verwendet, angewendet auf std::pair<bool, int>.

für den Compiler,

std::pair<bool, int>::A... 

ist die gleiche wie

std::pair<bool, int>:: A... 

und die gleiche wie

std::pair<bool, int> ::A... 

und die gleiche wie

std::pair<bool, int> :: A... 

Daher sucht der Compiler im Rahmen von std::pair<bool, int> nach einem A, der offensichtlich fehlschlägt.

See: Space(s) before/after the scope resolution operator

+0

Erklärung aber keine Lösung –

+0

@LightnessRacesinOrbit: Ja, na und? Die Frage war: "Warum bekomme ich Fehler ...". Problemumgehungen sind in der Frage sowieso vorhanden. – Pixelchemist

1

Here ‚sa knappere Reproduktion Beispiel:

struct T{}; 
T A(); 
T ::A() { return T(); } 

// error: no 'int T::A()' member function declared in class 'T' 

(! Beachten Sie die auto- int Typ Rückkehr versucht, von GCC als Überbleibsel aus C)

Dies ist ein C++ Eigenart. Du verwirrst den Parser, weil es aussieht, als ob du etwas mit std::pair<bool, int> ::A::B::C::D machen willst, was offensichtlich nicht existiert. (Der Abstand wird hier ignoriert, obwohl wir konventionell schreiben.)

Lassen Sie einfach die :: aus. Mit einer Funktionsdefinition brauchen Sie es sowieso nie.