【发布时间】:2012-01-20 19:50:36
【问题描述】:
我在 Debian Squeeze 上使用 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 template templates and perfect forwarding。这个问题表明这是一个 gcc 错误,但也许我错误地认为这些问题是关于同一件事的。
请温柔一点。我对可变参数模板的了解还不到 12 小时;我只是想重写一些旧的 C++ 代码以减少重复。我也有一段时间没有做任何 C++ 了。如果有解决方法,请告诉我。谢谢。
编辑:Ise Wisteria 在Variadic template templates and perfect forwarding 的 cmets 中建议的解决方法对我有用,这表明这是同一个错误。当然,我现在 (a) 想知道这种解决方法有多脆弱,(b) 它为什么起作用,以及是什么促使 Ise 想到它。 虽然我猜只有一诚可以回答最后一点。 :-)
【问题讨论】:
-
代码在 g++ 4.7 上编译。应该是一个错误。
-
@KennyTM:谢谢。这意味着我不需要报告,对吧?
-
那么,您希望这个问题发生什么?关闭为重复?也许回答你自己的问题? :) 这不能保持原样。
-
@Xeo:那么,在您看来,这绝对是链接问题的副本?如果是这样,我没有强烈的感情。如果我回答然后接受我的回答可以吗?除非你或其他人愿意。 :-) 如果它关闭了,搜索的人是否仍然可以看到它?
-
不完全一样,但问题是一样的,答案也是一样。不过我真的不在乎,不妨继续回答你自己的问题。 :)
标签: c++ c++11 variadic-templates template-templates