重複の可能性:
ログがstd名前空間にあるのはなぜですか?
戻り値に従ってC++関数をオーバーロードすることに基づいて、次の実験を行いました。
#include <cmath>
class myType
{
private:
double value;
myType(double value) : value(value) {}
public:
myType& operator= (const myType& other) {
if (this != &other) value = other.value;
return *this;
}
static myType test(double val) { return myType(val); }
friend std::ostream& operator<<(std::ostream& target, const myType& A);
};
std::ostream& operator<<(std::ostream& target, const myType& A){
target << A.value;
return target;
}
class asin {
private:
double value;
public:
asin(double value)
: value(std::asin( (value<-1.0) ? -1.0 : (value>1.0?1.0:value) ))
{}
operator double() { return value; }
operator myType() { return myType::test(value); }
};
int main(int argc, char *argv[])
{
myType d = asin(1.0);
std::cout << d << std::endl;
return 0;
}
その結果、
error: ‘myType::myType(double)’ is private
の最初の行main()
。もう少し実験してみると、これは正常に機能し、クラス名asin
をAsin
(またはその他のこと)に変更すると期待どおりに機能することがわかりました。どうやら、クラスを呼び出すことは許可されていませんが、クラスasin
を定義する(そして使用しない)という行為は警告/エラーを与えません。
今、私はこれがすべて悪い習慣であることを知っているので、それで私を怒らせないでください。私はこれを純粋に学問的な興味から尋ねます:なぜ私は私のクラスasin
、またはacos
またはatan
そのようなものを呼び出すことができないのですか?グローバル名前空間でこのクラスを定義してもこの特定の問題が発生しないように、すべてを-namespaceにcmath
隠しているという印象を受けました。std
誰かが何が起こっているのか説明できますか?