2016-05-19 2 views
0

Почему определение определяемого пользователем литерала внутри класса give 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; 
} 

ОШИБКА:

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

Примечание: Можно определить any friend function внутри класса.

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; 
} 

То же имя пользователя, которое определяется пользователем, может быть определено outside the class.

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

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

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

Имеет ли эта цитата из стандарта влияние?

A friend function defined in a class is in the (lexical) scope of the class in which it is defined. A friend function defined outside the class is not

+1

, когда вы выполняете 'operator << (std :: ostream &, test)' from 'main()' он должен искать эту функцию и ищет в 'test', потому что это один из параметров. с '_UNIT' единственным местом, где он выглядит, является текущее пространство, а' _UNIT' - нет. – vu1p3n0x

+1

Ключевое отличие состоит в том, что 'operator <<' имеет тип параметра, который расширяет поиск, но '_UNIT' не – vu1p3n0x

ответ

2

вопрос вы работаете в том, что, из [namespace.memdef]:

The friend declaration does not by itself make the name visible to unqualified lookup (3.4.1) or qualified lookup (3.4.3).

, как они найдены через аргумент зависимого поиска, [basic.lookup.argdep]:

When considering an associated namespace, the lookup is the same as the lookup performed when the associated namespace is used as a qualifier (3.4.3.2) except that: [...] Any namespace-scope friend functions or friend function templates declared in associated classes are visible within their respective namespaces even if they are not visible during an ordinary lookup (11.3).

std::ostream& operator<< (std::ostream& o, test t) находится в связи с аргументом-зависимого поиска по второму аргументу.

Когда вы определяете _UNITвнешне классу, он делает функцию видимой.

Однако при определении _UNIT инлайн - это не виден нормальный поиск и единственным аргументом (double) не имеют какие-либо связанные с ними пространств имен, так что нет никакого способа для того, чтобы найти с аргументом-зависимого поиском либо.