在类中定义朋友用户定义的文字运算符

时间:2016-05-19 15:56:33

标签: c++ c++11

为什么在类give error中定义用户定义的文字?

text = "&userId=2&mytotal=7&name0=this+is+my+text&name0=this+is+another+text&name1=this+is+a+third+text";
data = text.split("&");

var myValues = {};
for(var d in data){
    var parts = data[d].split("=");
    if(parts[0] != ""){
        if(parts[0].match(/[\w]+(\d)/)){
           var mt = parts[0].match(/[\w]+(\d)/); 
           var prop = mt[0].replace(mt[1],"");
           if(!myValues.hasOwnProperty(prop)){
              myValues[prop] = [];
              myValues[prop].push(parts[1]);
           }else{
              myValues[prop].push(parts[1]);
           }

       }else{
          myValues[parts[0]] = parts[1];  
       }

    }
}
console.log(myValues);
//Object { userId: "2", mytotal: "7", name: Array[3] }

ERROR:

class test
{
    long double x;
    public:    
    friend test operator""_UNIT(long double v)
    {
        test t;
        t.x = v;
        return t;
    }       
};

int main()
{
    test T = 10.0_UNIT;        
    return 0;
}

注意:可以在类中定义any friend function

unable to find numeric literal operator 'operator""_UNIT'

可以定义同一朋友用户定义的文字outside the class

class test
{
    int x;
    public:
    test():x(10) {}
    friend std::ostream& operator<< (std::ostream& o, test t)
    {
        o << t.x ;
        return o;
    }
};

int main() {
    test T;
    std::cout << T;
    return 0;
}

标准中的引用会产生影响吗?

  

类中定义的友元函数位于(词法)范围内   定义它的类。在外面定义的朋友功能   class不是

1 个答案:

答案 0 :(得分:2)

您遇到的问题是来自[namespace.memdef]:

  

朋友声明没有   本身使名称对非限定查找(3.4.1)或限定查找(3.4.3)可见。

找到它们的方式是通过参数依赖查找,[basic.lookup.argdep]:

  

在考虑关联的命名空间时,查找与执行时的查找相同   关联命名空间用作限定符(3.4.3.2),除了:[...]在关联类中声明的任何命名空间范围的朋友函数或朋友函数模板都是   即使它们在普通查找期间不可见(11.3),也可以在各自的命名空间中看到。

由于第二个参数的参数依赖查找,找到

std::ostream& operator<< (std::ostream& o, test t)

当您在课程中定义_UNIT 外部时,它会使该功能可见。

但是,当您定义_UNIT内联时 - 它对于正常查找是不可见的,并且唯一的参数(double)没有任何关联的命名空间,因此无法通过参数找到它 - 依赖查找。