c++ - C++模板类问题中的类型条件

标签 c++ templates metaprogramming

使用 GCC 4.2。 我有条件类型的元模板:

template <bool condition, typename Then, typename Else>
struct IF
{
    typedef Then RET;
};

template <class Then, class Else>
struct IF<false, Then, Else>
{
    typedef Else RET;
};

当我这样使用它时:

template <typename T>
class Param
{
    IF< sizeof(int)<sizeof(long), long, int>::RET  i;
};

它有效,但是当我这样使用它时(尝试使用模板参数):

template <typename T>
class Param
{
    IF< sizeof(int)<sizeof(long), T&, T* >::RET mParam;
};

我收到此错误代码:

error: type 'IF<false, T&, T*>' is not derived from type 'Param<T>'

为什么会这样?如何解决? 提前致谢!

最佳答案

在第二种情况下,RET 是什么,取决于模板类型T。编译器需要确保它将成为所有可能实例化中的类型(并且可能不是 IF 的某些实例化的静态成员)。您可以使用 typename 关键字来实现。

template <typename T>
class Param
{
    typename IF< sizeof(int)<sizeof(long), T&, T* >::RET mParam;

};

关于c++ - C++模板类问题中的类型条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3541557/

相关文章:

c++ - 用于与 arduino 进行串行通信的 struct termios 设置

c++ - 从模板化父类中的派生内部类访问 protected 成员变量

c++ - 减法给了我积极的结果 C++

c++ - gcc 可以编译可变参数模板而 clang 不能

c++ - 为什么我自定义的 `::swap` 函数没有被调用?

swift - 按名称获取类(class)

c++ - Cmake:如何选择 C++ header

C++ 仿函数和默认参数

ruby - ruby 中实例和类方法的生命周期回调

c++ - 在模板实例化期间,文字值不被视为常量表达式