簡體   English   中英

在C ++中使用部分專業化11

[英]Using Partial Specialization in C++11

我有以下代碼:

template<class T, int I=44> struct test {T j = I;};

template<int J> struct test<int, J> {int j = J;};

int main()
{
  test<55> jj;

  std::cout << jj.j << std::endl;
  return(1);
}

編譯器(clang)只抱怨行test<55> jj

我不明白為什么? 有工作嗎?

如果它抱怨該行,為什么不抱怨第二個模板定義?

提前致謝。

消息是:

enable.cpp:17:8: error: template argument for template type parameter must be a type
test<55> jj;
   ^~
enable.cpp:9:16: note: template parameter is declared here
template<class T, int I=44> struct test

問題是您還沒有理解選擇類模板專業化的方式。

你的專長:

template<int J> struct test<int, J> {int j = J;};

不會創建只需傳入單個int模板參數的模板。

test<55> jj; // doesn't work because there's no template<int J> struct test

相反,它所做的是創建template<class T, int I> struct test ,當template<class T, int I> struct test的模板參數匹配特化時,即test<int,J>

test<int,55> jj; // uses the specialization template<int J> struct test<int, J>

這是標准的關鍵引用:

在引用類模板特化的類型名稱中(例如, A<int, int, 1> ),參數列表應與主模板的模板參數列表匹配。 專門化的模板參數是從主模板的參數推導出來的。 [強調補充]

- 14.5.5.1 [temp.class.spec.match] p4


您似乎嘗試將int設置為T的默認類型,同時為I設置獨立的默認值。 我認為您的意圖是能夠指定類型和值,僅指定類型並將44作為默認值,或者僅指定值並將int作為默認類型。

不幸的是,我不知道如何指定這樣的獨立默認值。 您可以指定默認值( template<class T=int, int I=44> struct test ),但獲取默認類型也需要接受默認值。

但是,如果您願意使用第二個名稱,那么您可以:

template <int I>
using test_int = test<int, I>;

這將創建一個模板別名,以便您只需指定一個值:

test_int<55> jj;

這將最終使用任何專門化test<int, I>碰巧解決是否存在顯式特化或編譯器生成隱式特化。

出現第一個錯誤是因為編譯器嘗試使用55實例化第一個模板參數( class T )。這不起作用,因為55本身不是一個類型,而是它的實例化。 但是, test<int>有效,因為模板parater是一個類型,由模板簽名請求。

你想要的只是“currying”類型,又名。 模板別名:

template <typename T>
struct test2 = using test<T, 55>;

在這里你只需要提供一個T來選擇55作為固定的第二個參數。 但是你仍然需要通過給它一個具體的T來使用那種類型,例如test2<double>

評論表明您也可能對以下變體感興趣:

template <int I>
using test3 = test<int, I>;

在這里,您將第一個類型參數修復為int,這允許您像在代碼中一樣使用它:

test3<55> t;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM