メモの日々


2009年04月08日(水) [長年日記]

  • 久〜しぶりにC++を使ってる。

[c++] g++でCP932なソースをビルドしたらlexical_cast.hppでエラー

Ubuntu 8.10上でCP932で書かれたC++のソースコードを g++ に「-finput-charset=cp932」オプションを付けてビルドしようとしたら、boost/lexical_cast.hpp を include している個所でエラーになってしまった。

調べると、lexical_cast.hpp 内の最初のコメント内に

// who:   contributed by Kevlin Henney,
//        enhanced with contributions from Terje Sletteb■,

とあって、■の所に0xf8が書かれておりそこで文字コード変換に失敗してしまうようだった。

ひとまず問題の文字を削除してしまうことで対処。

でも、include先のソースの文字コードは不明なケースがあるので、g++(gcc) の -finput-charset を使うのはよいアプローチではない気がしてきた。

[c++] g++ではおかしなフレンド関数がエラーになる

WindowsではビルドできていたソースをUbuntuのg++でビルドしているんだが、フレンド関数の所でエラーになった。

フレンド関数なんて使ったことないので知らなかったのだが、調べると関数に対してクラスのプライベートメンバへのアクセスを許可したいときに使うようだ。

んで、ビルドエラーになる箇所を見ると、そのクラスと無関係なフレンド関数を使おうとするとエラーになるみたい。サンプルを作ってみた。

class A {
    friend void f(A& a); // Aと関係している
    friend void g();     // Aと無関係
private:
    int secret;
};

int main() {
    A a;
    f(a);
    g(); // ここがエラーになる
    return 0;
}

void f(A& a) {
    a.secret = 100;
}

void g() {
}

これをg++でコンパイルすると、g()を呼び出す所でエラーになる。

$ g++ --version
g++ (Ubuntu 4.3.2-1ubuntu12) 4.3.2
Copyright (C) 2008 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$ g++ -Wall friend.cpp
friend.cpp: In function ‘int main()’:
friend.cpp:11: error: ‘g’ was not declared in this scope

Windowsのコンパイラだとエラーにならないようだし、別にエラーにしなくてもいい気がするが、実装上の問題なのかな。 どうせなら呼び出し箇所ではなく宣言箇所でエラーになればいいのに。

[book] ジェネラル・ルージュの凱旋 (海堂尊)

読んだ。救命救急センターの「将軍」速水部長はできる男だという話。事件は何も起きなくて、病院内での政治の話が続く。ジェネラル・ルージュの凱旋(海堂尊/著)

現場を率いる速水と対立する規約第一沼田助教授の振る舞いが、ソフトウェア開発現場を改善しようとするISO 9000活動とダブって見えて興味深かった。3.5点。

やること

  • 換金