我正在看看std::tuple_size
是如何在我的系統上的標準庫中定義的。我有一個Mac OS,編譯器版本是Apple LLVM version 8.1.0 (clang-802.0.42)
。標準庫在InstalledDir
位置發現g++ --version
衝突的不匹配標籤使用標準庫進行編譯,但不是其他方式
作爲輸出鑑於下面的代碼不編譯(因爲clang
不喜歡專門/重新聲明的東西如先前定義爲class
,反之亦然struct
)
#include <iostream>
#include <utility>
#include <array>
#include <tuple>
#include <type_traits>
using std::cout;
using std::endl;
template <class T>
class Something;
template <class One, class Two>
struct Something<std::pair<One, Two>>;
template <class One, class Two>
class Something<std::pair<One, Two>>
: public std::integral_constant<int, 2> {};
int main() {
cout << std::tuple_size<std::array<int, 2>>::value << endl;
cout << std::tuple_size<std::tuple<int, int>>::value << endl;
cout << std::tuple_size<std::pair<int, int>>::value << endl;
}
,出現以下錯誤
error: struct template 'Something' was previously declared as a class template [-Werror,-Wmismatched-tags]
struct Something<std::pair<One, Two>>;
^
test.cpp:49:7: note: previous use is here
class Something;
我看到了下面的代碼在標準庫的頭<array>
(與tuple_size
按照後面的專門定義爲class
)
template <class T> class tuple_size;
template <size_t I, class T> class tuple_element;
template <class T1, class T2> struct tuple_size<pair<T1, T2> >;
如何消除對Something
的定義和聲明後,在上面的代碼中使用時這個編譯?上述代碼是否應該提出關於tuple_size
被定義或聲明兩次的警告,作爲class
和另一個作爲struct
?
也許這將是很好的添加您的問題的上下文。我今天看到你以前的問題(你可能已經刪除了,因爲我現在看不到它們)並且發現當前的問題是合法的。然而,如果沒有這種背景,這個問題可能會被認爲是一種不完整的... –
@ W.F。我刪除了他們,因爲我不想進入解釋我自己的論點。人們似乎並不喜歡上下文,並認爲它超出了範圍。我無法複製我的工作基礎架構的環境,所以我已經縮小了我認爲在那裏的標準庫以及我不瞭解的問題的範圍。 – Curious
好吧,稍微強調結構/類問題可以使問題更清楚一些,我認爲... –