小编gil*_*mec的帖子

C++中的嵌套子类

我正在尝试创建一个嵌套类,它也是其父类的子类:

struct X { struct Y : public X {}; };
Run Code Online (Sandbox Code Playgroud)

不幸的是,在C++中似乎不允许这样做,因为g ++会产生错误

错误:无效使用不完整类型'struct X'

但是,我的实际代码有X一个模板类:

template<typename T> struct X
{ struct Y : public X {}; };
Run Code Online (Sandbox Code Playgroud)

我收到相同的消息,但这次只是一个警告:

警告:无效使用不完整类型'struct X <T>'

我的问题是:为什么前一种情况是非法的,而模板化的案例只是发出警告?模板化版本的工作方式完全符合我的预期(我可以创建实例X<T>::Y,将它们转换为X<T>等等),但警告是否意味着我不应该使用它?如果忽略警告,我可能会遇到什么问题?

c++ subclass inner-classes

12
推荐指数
2
解决办法
366
查看次数

使用函数指针进行模板推导返回

从g ++ - 5转到g ++ - 6时,我以前工作过的代码失败了; 先前可导出的模板不再可以推导出来.一个最小的例子:

#include <math.h>

template<typename T,typename T1>
T apply(T (*func)(T1), const T1 &val)
{
  return func(val);
}

int main(void)
{
  double val1 = 0.5, val2 = apply(ceil,val1);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

g ++ - 6似乎无法找到正确的版本ceil:

foo.cpp: In function ‘int main()’:
foo.cpp:11:44: error: no matching function for call to ‘apply(<unresolved overloaded function type>, double&)’
   double val1 = 0.5, val2 = apply(ceil,val1);
                                        ^
foo.cpp:4:3: note: candidate: template<class T, class T1> T apply(T (*)(T), const T1&) …
Run Code Online (Sandbox Code Playgroud)

c++ templates function-pointers

6
推荐指数
1
解决办法
110
查看次数

Haskell中的安全和多态Enum

我正在尝试编写不安全Enum函数的完整版本:

predMay :: Enum a => a -> Maybe a
succMay :: Enum a => a -> Maybe a
toEnumMay :: Enum a => Int -> Maybe a
Run Code Online (Sandbox Code Playgroud)

我的问题是不安全的函数只是部分,如果Enum也是Bounded,所以安全版本在两种情况下应该有不同的形式:

predMayUnboundedEnum :: Enum a => a -> Maybe a
predMayUnboundedEnum = Just . pred

predMayBoundedEnum :: (Enum a, Bounded a) => a -> Maybe a
predMayBoundedEnum x
  | fromEnum x == fromEnum (minBound `asTypeOf` x) = Nothing
  | otherwise  = Just (pred x)
Run Code Online (Sandbox Code Playgroud)

我必须得到我想要的功能的最好的想法是使用另一个类型类:

class …
Run Code Online (Sandbox Code Playgroud)

polymorphism enums haskell

4
推荐指数
1
解决办法
197
查看次数