1

重複の可能性:
ログが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()。もう少し実験してみると、これは正常に機能し、クラス名asinAsin(またはその他のこと)に変更すると期待どおりに機能することがわかりました。どうやら、クラスを呼び出すことは許可されていませんが、クラスasinを定義する(そして使用しない)という行為は警告/エラーを与えません。

今、私はこれがすべて悪い習慣であることを知っているので、それで私を怒らせないでください。私はこれを純粋に学問的な興味から尋ねます:なぜ私は私のクラスasin、またはacosまたはatanそのようなものを呼び出すことができないのですか?グローバル名前空間でこのクラスを定義してもこの特定の問題が発生しないように、すべてを-namespaceにcmath隠しているという印象を受けました。std

誰かが何が起こっているのか説明できますか?

4

2 に答える 2

1

asinは、C ++標準ライブラリでグローバル関数として定義されており、数学ライブラリでも定義されています(したがって、std ::を使用する必要はありません)。名前空間を使用しない場合、「asin」の使用はあいまいです。エラー。そして名前空間はあなたの問題を解決します。

于 2012-09-24T17:22:59.707 に答える
-1

Visual Studio などの一部の IDE では、cmath を含める必要さえありません。これらの関数は、グローバル名前空間で既に定義されています。cmath を除外してみると、asin() がまだ定義されていることがわかります。

于 2012-09-24T11:03:30.167 に答える