2015-06-05 29 views
1

先前的問題及答案(here)顯示,元組的列表可以通過以下方式創建:C++:元組的名單C++ 11/1Y

#include <vector> 
#include <boost/tuple/tuple.hpp> 
using namespace std; 
using boost::tuple; 
typedef vector< tuple<int, int> > tuple_list; 

在運行時,我沒有得到一個錯誤與C++ 98,C++ 1Y(GCC/GNU在Ubuntu)給出:

error: template argument 1 is invalid 
typedef vector< tuple<int, int> > tuple_list; 
           ^
error: template argument 2 is invalid 
error: invalid type in declaration before ‘;’ token 
typedef vector< tuple<int, int> > tuple_list; 
              ^

任何想法是怎麼回事? (如果我能有其他的線程上評論我也有,但真棒SO說我的名聲太低,無法發表評論!)

+1

你是否傳遞了'-std = C++ 11'編譯器標誌來啓用C++ 11?如果是,那麼編譯器的版本是什麼? – vsoftco

+0

@vsoftco OP使用'boost :: tuple'而不是C++ 11'std :: tuple' – NathanOliver

+0

gcc版本4.8.2(Ubuntu 4.8.2-19ubuntu1) – so860

回答

7

的問題是一個名稱衝突,你是using boost::tuplenamespace std;,這兩者帶來tuple進入全球範圍,所以你最終得到兩個相同模板的定義。我不明白爲什麼編譯器是不是在雖然診斷的錯誤更明確的...

刪除或者using boost::tuple;using namespace std;,並限定相應的名稱:

#include <vector> 
#include <boost/tuple/tuple.hpp> 
//using namespace std; 
//using boost::tuple; 
typedef std::vector< boost::tuple<int, int> > tuple_list; 

int main() 
{ 
    tuple_list foo; 
} 

我想這是一個最好的例子爲什麼using不是太推薦;)

+0

'使用'不是「不太推薦」。你需要知道你可能在做什麼。另外,不同的編譯器可能實際上爲您提供了所有您需要的信息:http://coliru.stacked-crooked.com/a/4fab2e1cdbb35ea7 – rubenvb

+0

@rubenvb是的,鏗鏘聲++在診斷方面似乎更好。就個人而言,我更喜歡在標準名稱之前使用'std ::',儘管我對此沒有超強認識:) – vsoftco

+3

@rubenvb'使用namespace std;'(並且通常情況下,對所有不嚴格控制的命名空間使用「namespace」 )**是**「不太推薦」,尤其是在文件範圍 – Yakk