c++ - 如何根据其他参数设置嵌套模板类实例化作为默认模板参数

标签 c++ templates

我有以下模板类和示例类:

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"; }
};

当使用 vc14 时,上面的代码编译得很好,并为 X<Asample, Bsample> 的实例化生成预期的行为。默认模板参数CAsample::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 接受的答案之外,我还必须在结束模板参数小括号之间插入一个空格(空格):

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>>
                                                                            ^

最佳答案

您需要typename template这里:

template<typename A, typename B, typename C = typename A::template Nested<B>>

template说比 A::Nested是一个模板,typenameA::Nested<B>命名一个类型。

您还需要移动 Asample::Nested 的特化出Asample定义:

struct Asample
{
    template<typename B>
    struct Nested;

    static const char* who()    { return "Asample"; }
};

template<>
struct Asample::Nested<Bsample>
{
    static const char* who()    { return "Asample::Nested<Bsample>"; }
}; 

Live demo

关于c++ - 如何根据其他参数设置嵌套模板类实例化作为默认模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40503145/

相关文章:

c++ - 使用constexpr返回函数值C++的模板函数调用

c++ - 转换为未知模板类型

C++ header 样式

c++ - "Abusing"减少 if 嵌套的循环

wpf - 免费的WPF应用程序模板?

具有静态方法的类的 C++ 模板

c++ - Visual C++ 2010 快速编译错误

c++ - lambda 函数/表达式是否支持 constexpr?

templates - 转到 HTML 模板 : Can I stop the templates package inserting quotes around strings in scripts?

c++ - 如何将成员函数作为参数传递?