c++ - 如何解决C++模板类型声明顺序

标签 c++ template-meta-programming

我正在实现一个非常复杂的基于模板的功能,但遇到了无法解决的错误。我已将我的情况简化为以下代码:

template <typename Head, typename... T>
struct BaseIsFirst {
    using Base = Head;
};

template <typename T, typename D>
struct IAction {
    std::enable_if_t<std::is_same<T, D::Base>::value> do_action() {}
};

struct Base;
struct Derived1;
struct Derived2;
typedef BaseIsFirst<Base, Derived1, Derived2> MyBIF;

struct Base : public IAction<Base, MyBIF> { };
struct Derived1 : public Base {};
struct Derived2 : public Base {};

如果我尝试编译它,我会收到错误:

'std::is_same': 'D::Base' is not a valid template type argument for parameter '_Ty2'

我认为没有办法提前定义所使用的类型。是否有解决方法,或者根本不可能?

最佳答案

当使用模板参数定义的类型时,需要指定它是一个类型。您的申报单没有任何问题。试试这个吧

template <typename T, typename D>
struct IAction {
    std::enable_if_t<std::is_same<T, typename D::Base>::value> do_action() {}
    //             Add typename here ^^^^^^^^
};

关于c++ - 如何解决C++模板类型声明顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42349842/

相关文章:

c++ - Qt 程序在尝试访问特定类型的指针时崩溃

c++ - 查找字符串 1 包含字符串 2 C++ 的次数的函数

c++ - C++中的类型转换和引用

c++ - C++中 "abc"的类型是什么?

c++ - 读取 DirectX 游戏覆盖

c++ - 静态断言可变参数模板的嵌套值是唯一的

c++ - 使用模式初始化 `constexpr` 数组

c++ - 虚拟继承是否强制基类默认可构造?

C++ 编译时谓词,用于测试是否可以使用 T 类型的参数调用 F 类型的可调用对象

c++ - 创建一个类的所有构造函数的类型列表