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