2016-12-04 8 views
1

なぜ私が得るか、ファイルerror_xxx_does_not_name_a_type.cppのコンパイルエラーに名前を付けていない
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()エラーYYYでxxxはタイプ

// 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(); 
}; 
}}} 

// 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; } 

私はg++ -Wall -Wextra -std=c++14 -c error_xxx_does_not_name_a_type.cppとし、上でコンパイルしたg++ (Ubuntu 5.3.0-3ubuntu1~14.04) 5.3.0 20151204

+0

驚いたことに、これの投票率の高い詐欺はありません。 –

答えて

2

 (スペース)はirこの文脈に関連し、::が範囲解決演算子として使用され、std::pair<bool, int>に適用されます。コンパイラ

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

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

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

std::pair<bool, int> :: A... 
と同様に同じと同じです

したがって、コンパイラはstd::pair<bool, int>の範囲内のAを探していますが、これは明らかに失敗します。

参照:例を再生しterser Space(s) before/after the scope resolution operator

+0

解説はありますが解決策がありません –

+0

@ LightnessRacesinOrbit:そうですね。問題は「なぜ私はエラーを起こすのですか...」でした。とにかく問題の回避策が提供されます。 – Pixelchemist

1

Here「はSA:

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

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

(!CからホールドオーバとしてGCCによって試み自動int戻り値の型を注意してください)

これは、 C++の変種。パーサーを混乱させるのは、std::pair<bool, int> ::A::B::C::Dで何かをしようとしているように見えますが、それは明らかに存在しません。 (ここでは無視していますが、通常どおり書いていますが)

::は除外します。関数定義では、決してそれを必要としません。

関連する問題