Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ decltype的另一个问题 //在本例中,这只是静态\u numeric\u limits.h的一个片段 #包括 模板 结构静态数值极限; 模板 结构静态\u数值\u限制 {/*min超出了枚举的范围*/ 静态常量有符号字符最小值=SCHAR_最小值, max=SCHAR_max; }; /*这个“剩余”模板在这里的原因是字符受到的威胁与签名字符不同*/ 模板 结构静态\u数值\u限制 {/*min超出了枚举的范围*/ 静态常数char min=SCHAR_min, max=SCHAR_max; }; 模板 结构静态\u数值\u限制 { 静态常量无符号字符最小值=0x0, max=UCHAR_max; }; ///真正的问题从这里开始 模板 结构整型 { Int():值(IntType()) {} Int(常量Int类型和模式) { 值=(模式); } constexpr内联IntType getValue()const { 返回值; } 私人: IntType值; }; 模板 自动操作员+ (内部和左侧、内部和右侧) ->Int//这就是问题所在 { 返回lhs.getValue()+rhs.getValue(); }_C++_Friend_Decltype - Fatal编程技术网

C++ decltype的另一个问题 //在本例中,这只是静态\u numeric\u limits.h的一个片段 #包括 模板 结构静态数值极限; 模板 结构静态\u数值\u限制 {/*min超出了枚举的范围*/ 静态常量有符号字符最小值=SCHAR_最小值, max=SCHAR_max; }; /*这个“剩余”模板在这里的原因是字符受到的威胁与签名字符不同*/ 模板 结构静态\u数值\u限制 {/*min超出了枚举的范围*/ 静态常数char min=SCHAR_min, max=SCHAR_max; }; 模板 结构静态\u数值\u限制 { 静态常量无符号字符最小值=0x0, max=UCHAR_max; }; ///真正的问题从这里开始 模板 结构整型 { Int():值(IntType()) {} Int(常量Int类型和模式) { 值=(模式); } constexpr内联IntType getValue()const { 返回值; } 私人: IntType值; }; 模板 自动操作员+ (内部和左侧、内部和右侧) ->Int//这就是问题所在 { 返回lhs.getValue()+rhs.getValue(); }

C++ decltype的另一个问题 //在本例中,这只是静态\u numeric\u limits.h的一个片段 #包括 模板 结构静态数值极限; 模板 结构静态\u数值\u限制 {/*min超出了枚举的范围*/ 静态常量有符号字符最小值=SCHAR_最小值, max=SCHAR_max; }; /*这个“剩余”模板在这里的原因是字符受到的威胁与签名字符不同*/ 模板 结构静态\u数值\u限制 {/*min超出了枚举的范围*/ 静态常数char min=SCHAR_min, max=SCHAR_max; }; 模板 结构静态\u数值\u限制 { 静态常量无符号字符最小值=0x0, max=UCHAR_max; }; ///真正的问题从这里开始 模板 结构整型 { Int():值(IntType()) {} Int(常量Int类型和模式) { 值=(模式); } constexpr内联IntType getValue()const { 返回值; } 私人: IntType值; }; 模板 自动操作员+ (内部和左侧、内部和右侧) ->Int//这就是问题所在 { 返回lhs.getValue()+rhs.getValue(); },c++,friend,decltype,C++,Friend,Decltype,错误(来自VS2010) 错误C2027:使用未定义类型“静态数值限制” 错误(来自gcc 4.6) 错误:“decltype((lhs->getValue()+rhs->getValue())”不是模板常量参数的有效类型 为什么它不能像我想的那样工作?这里的错误是decltype从您的表达式中推断出的类型;不幸的是,错误消息并不清楚,这实际上是一个有点棘手的问题 考虑表达式的类型0+0。它是一个int,是的,但更重要的是它是一个右值(非正式地说,它是一个临时值)。这意味着decltype(0+

错误(来自VS2010)
错误C2027:使用未定义类型“静态数值限制”

错误(来自gcc 4.6)
错误:“decltype((lhs->getValue()+rhs->getValue())”不是模板常量参数的有效类型


为什么它不能像我想的那样工作?

这里的错误是
decltype
从您的表达式中推断出的类型;不幸的是,错误消息并不清楚,这实际上是一个有点棘手的问题

考虑表达式的类型
0+0
。它是一个
int
,是的,但更重要的是它是一个右值(非正式地说,它是一个临时值)。这意味着
decltype(0+0)
不是
int
,而是
int&
。现在考虑你的代码没有什么不同,在这方面:你仍然有一个rValue/< P> 问题是模板非类型参数不能是右值引用,因此您不能有
Int
,因为第二个参数的类型。但你能做的是:

//THIS IS JUST A FRAGMENT OF A static_numeric_limits.h for the purpose of this example   
 #include <limits.h>

    template<class T>
    struct static_numeric_limits;

    template<>
    struct static_numeric_limits<signed char>
    {/*min was outside of range for enum*/
        static const signed char min = SCHAR_MIN,
                                 max = SCHAR_MAX;
    };

    /*This "surplus" template is here for the reason that char is threated differently from signed char */
    template<>
    struct static_numeric_limits<char>
    {/*min was outside of range for enum*/
        static const char min = SCHAR_MIN,
                          max = SCHAR_MAX;
    };

    template<>
    struct static_numeric_limits<unsigned char>
    {
        static const unsigned char min = 0x0,
                             max = UCHAR_MAX;
    };
 ///REAL PROBLEM STARTS FROM HERE      
     template<class IntType,IntType low_range = static_numeric_limits<IntType>::min>
    struct Int
    {
        Int():value_(IntType())
        {}
        Int(const IntType& pattern)
        {
            value_ = (pattern);
        }
        constexpr inline IntType getValue()const
        {
            return value_;
        }
    private:
        IntType value_;
    };

    template<class IntType,class IntType_1>
    auto operator+
        (Int<IntType>& lhs, Int<IntType_1>& rhs)
        -> Int<decltype(lhs.getValue() + rhs.getValue())>//HERE IS THE PROBLEM
    {
        return lhs.getValue() + rhs.getValue();
    }
#包括
// ...
模板
自动运算符+(常量Int&lhs,//常量正确!
土木工程(内部和右侧)
->Int::type>
{
返回lhs.getValue()+rhs.getValue();
}
这将取消对
int&
的引用,为您提供裸
int
类型。希望gcc的错误消息更有意义:它试图告诉您不能对非类型参数使用
int&


另一个问题,尽管可能不是问题,是整数算术经历了所谓的。因此,将两个
Int
的值相加的结果实际上是一个
Int
,因此您的返回类型应该是
Int
(并且是固定代码)


那么,问题是您没有定义
静态\u数值\u限制
。但正如我所说,我怀疑这不是一个问题,你实际上已经定义了它,只是没有显示在你的问题中。

@GMan这是一个非常好的答案。谢谢你知道为什么那些反对票吗?这个问题怎么了?@那里:有一个很大的讨论,但被删除了。人们觉得你发表了一个咆哮,而不是一个问题,因为你在最后的声明,所以关闭了它,投了反对票。我辩称情况并非如此,并通过编辑进行了澄清,并建议人们将其视为咆哮,因为他们不喜欢你的其他问题。不管谁是对的,这个问题被重新打开,评论被删除。不过,以后要尽量把你的问题弄清楚,尽量消除你的任何想法或挫折感。@GMan对不起,我的帖子哪一部分表明你在咆哮?看在上帝的份上,一个人不能表达自己的个人观点吗?我以什么方式侮辱或激怒了任何人?这太可笑了。@GMan它会编译,但最终会得到错误的结果。我很抱歉(好的,我们开始了),但是非常慢的2010是如此多的bug,以至于实际上不可能用它做真正的工作(使用C++0x)。编译器中的所有可能的C++特征都是BGGY。可怜的。仅仅因为“0+0”产生一个右值并不意味着decltype(0+0)是int&&,正如前面所说的那样。请注意,要将
getValue
标记为
constexpr
,您的构造函数需要标记为
constexpr
,这样就可以将
value
作为一个常量表达式。
#include <type_traits>

// ...

template <class IntType, class IntType_1>
auto operator+(const Int<IntType>& lhs, // be const-correct!
                const Int<IntType_1>& rhs)
                -> Int<typename std::remove_reference<
                        decltype(lhs.getValue() + rhs.getValue())>::type>
{
    return lhs.getValue() + rhs.getValue();
}