簡體   English   中英

使用gcc 4.4的模板模板參數和可變參數模板

[英]Template template parameters and variadic templates with gcc 4.4

我在Debian上使用gcc 4.4。 請考慮以下代碼。

#include <map>
#include <string>
using std::map;
using std::string;

// Args lets the user specify additional explicit template arguments
template <typename T,
      template <typename T, typename... Args> class C,
      typename... Args>
C<T, Args...> foo()
{
  C<T, Args...> x;
  return x;
}

int main(void)
{
  map<string, int> a = foo<string, map, int>();
}

所以,這里的想法是T匹配stringC匹配map ,模板參數包Args匹配int 我可能有一些錯誤的語法,如果是這樣,請更正。 特別是,如果想要class C的第一個模板參數匹配T而其余的要匹配模板參數包Args ,那么template <typename T, typename... Args> class C是否正確?

這給出了錯誤

In function 'int main()':
post.cc:18: error: no matching function for call to 'foo()'

這看起來類似於Variadic模板模板和完美轉發的問題 這個問題表明這是一個gcc bug,但也許我錯誤地認為這些問題是關於同一件事。

請溫柔。 我對可變參數模板的了解不到12小時; 我只是想重寫一些舊的C ++代碼來減少重復。 自從我做了任何C ++以來,它已經有一段時間了。 如果有解決方法,請告訴我。 謝謝。

編輯:在Variadic模板模板的評論中提出的解決方法 Ise Wisteria的 完美轉發為我工作,這表明這是同一個錯誤。 當然,我現在(a)想知道這種解決方法是多么脆弱,(b)為什么它有效,以及是什么促使伊思思考它。 雖然我猜只有伊勢才能回答最后一點。 :-)

正如編輯中所討論的,我的問題似乎與鏈接問題, Variadic模板模板和完美轉發相同 特別是,在鏈接中給出的解決方法也適用於我的情況。 有效的修改代碼如下:

#include <map>
#include <string>
using std::map;
using std::string;

template <typename T,
      template <typename T, typename... Args> class C,
      typename... Args>
struct X
{
  typedef C<T, Args...> type;
};

template <typename T,
      template <typename T, typename... Args> class C,
      typename... Args>
typename X<T, C, Args...>::type foo()
{
  C<T, Args...> x;
  return x;
}

int main(void)
{
  map<string, int> a = foo<string, map, int>();
}

我不認為variadic模板參數可以匹配g ++ 4.4中的非變量參數,因此您需要使用非可變參數版本重載foo函數。

另外請記住,map實際上有兩個以上的模板參數,因此也不會匹配新的foo函數。

這個對你的例子的補充應該澄清它:

#include <map>
#include <string>
using std::map;
using std::string;

// Args lets the user specify additional explicit template arguments
template <typename T,
          template <typename T, typename... Args> class C,
          typename... Args>
C<T, Args...> foo() {
  C<T, Args...> x;
  return x;
}

template<typename T, template<typename, typename> class C, typename Arg>
C<T, Arg> foo() {
  return C<T, Arg>();
}

template<typename T, typename... Args> class A {};

template<typename T, typename Arg> class B {};

int main(void) {
  map<string, int> a = foo<string, map, int>(); // fails.
  A<string, int> x = foo<string, A, int>();
  B<string, int> y = foo<string, B, int>();
}

暫無
暫無

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

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