2016-12-04 64 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()錯誤XXX在YYY沒有指定類型

// 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,這確實會失敗。

參見: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' 

(!注由GCC試圖作爲從C故障保持的自動int返回類型)

這是一個C++怪癖。你對解析器感到困惑,因爲它看起來像你試圖用std::pair<bool, int> ::A::B::C::D做一些事情,這顯然不存在。 (儘管我們常規編寫的方式,但在這裏忽略了間距。)

只是省略了::。有了函數定義,你永遠不需要它。