0

次のコードを実行すると、「セグメンテーション違反 11」エラーが発生します。コードは実際にコンパイルされますが、実行時にエラーが発生します。

//** Terror.h **

#include <iostream>
#include <string>
#include <map>

using std::map;
using std::pair;
using std::string;

template<typename Tsize>
class Terror
{
    public:
    //Inserts a message in the map.
    static Tsize    insertMessage(const string& message)
    {
        mErrorMessages.insert( pair<Tsize, string>(mErrorMessages.size()+1, message) );
        return mErrorMessages.size();
    }

    private:
    static map<Tsize, string>       mErrorMessages;
};

template<typename Tsize>
map<Tsize,string> Terror<Tsize>::mErrorMessages;

//** エラー.h **

#include <iostream>
#include "Terror.h"

typedef unsigned short errorType;
typedef Terror<errorType>   error;
errorType memoryAllocationError=error::insertMessage("ERROR: out of memory.");

//** main.cpp **

#include <iostream>
#include "error.h"
using namespace std;

int main()
{   
    try
    {
        throw error(memoryAllocationError);
    }
    catch(error& err)
    {
    }
}

コードをデバッグしていて、メッセージが静的マップメンバーに挿入されているときにエラーが発生します。観察は、私が行を置くと次のようになるということです:

errorType memoryAllocationError=error::insertMessage("ERROR: out of memory.");

グローバルスコープではなく「main()」関数内で、すべて正常に動作します。しかし、ローカル スコープではなく、グローバル スコープでエラー メッセージを拡張したいと考えています。「エラー」のすべてのインスタンスが同じエラー コードとメッセージを共有するように、マップは静的に定義されます。これや似たようなものをどうやって手に入れることができるか知っていますか。

どうもありがとうございました。

4

2 に答える 2

2

OS X 10.8 用にコンパイルしたアプリケーションを Mac OS X 10.7 で実行しようとしたときに、同じ問題が発生しました。

ターゲットを 10.7 に設定すると、問題は解決しました。アプリケーションは、10.7 と 10.8 の両方の OS X 環境で問題なく動作します。

于 2013-04-08T19:18:55.527 に答える
0

mErrorMessagesを呼び出して使用する前に、 のコンストラクターが実行されることを確認する必要がありますinsertMessage。これは好きなように行うことができますが、何らかの方法で行う必要があります。

于 2012-10-07T03:29:58.257 に答える