我正在尝试创建一个嵌套类,它也是其父类的子类:
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>等等),但警告是否意味着我不应该使用它?如果忽略警告,我可能会遇到什么问题?
从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) 我正在尝试编写不安全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)