[英]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
匹配string
, C
匹配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.