我有以下模板类&示例类:如何设置,作为默认模板参数,嵌套模板类instanciation取决于其他参数
template<typename A, typename B, typename C = typename A::Nested<B>>
struct X
{
X()
{
std::cout << "A is : " << A::who() << std::endl;
std::cout << "B is : " << B::who() << std::endl;
std::cout << "C is : " << C::who() << std::endl;
}
};
struct Bsample
{
static const char* who() { return "Bsample"; }
};
struct Asample
{
template<typename B>
struct Nested;
template<>
struct Nested<Bsample>
{
static const char* who() { return "Asample::Nested<Bsample>"; }
};
static const char* who() { return "Asample"; }
};
当使用VCl 4,以上代码编译就好,并产生预期的行为为X<Asample, Bsample>
默认模板参数C
到Asample::Nested<Bsample>
的实例。
然而,GCC 5.1编译时,我得到以下错误:
prog.cpp:4:65: error: expected '>' before '<' token
template<typename A, typename B, typename C = typename A::Nested<B>>
^
我试了几个组合,以申报模板参数C
默认值,使用template
,typename
,...但没有成功地使用GCC编译此代码。
如何使此代码符合C++标准并使用GCC进行编译?
感谢您的帮助
编辑:除了从TartanLlama
除了从TartanLlama接受的答案接受的答案,我也只好终止模板参数brakets之间插入空白(空间) :
template<typename A, typename B, typename C = typename A::Nested<B> >
// blank (space) added here^
否则,GCC将发出以下错误(未指定选项-std=c++11
时):
error: spurious '>>', use '>' to terminate a template argument list
template<typename A, typename B, typename C = typename A::template Nested<B>>
^
我投票重新开放,因为这不仅仅是'template'和'typename',它似乎像OP知道他们的使用,但不知道如何在这里应用它。 – TartanLlama
@TartanLlama:可悲的是,有些人比光明更快地解决问题,甚至没有把它们读到最后......(我有一个想法,迄今为止谁已经关闭了我。)谢谢你重新开放。 – shrike