コグノスケ


link 未来から過去へ表示  link 過去から未来へ表示(*)

link もっと前
2010年6月16日 >>> 2010年7月13日
link もっと後

2010年6月16日

noncopyableを継承したクラスを継承するとエラー?

(説明は後述)link コードとVC++ のプロジェクトファイルを固めたものへのリンク。

C++ の超有名ライブラリboostに、デフォルトのコピー操作をコンパイル時点でエラーにしてくれるboost::noncopyableという便利クラスがあります。

C++ ではコピー操作(コピーコンストラクタやoperator=)が未定義のクラスでコピー操作を行うと、デフォルトのコピーが働きます。しかしポインタをコピーしてしまうなど、デフォルトのコピーでは困るケースがあります。boost::noncopyableを使うと、気づかないうちに意図しないコピーを使っていないかどうかを、コンパイル段階で検出できるのです。便利でしょ。

前置きが長くなりましたが、私もこれはいいなと思って使ってみたのですが、g++ 4.3.2では何も言われないのに、VC++ 2010だとエラーになってしまい困っています。

私の使い方が何か間違っているだけかもしれませんが、同じコードをコンパイルしてもg++ 4.3.2は何も言いません。しかもVC++ 2010の出すエラーメッセージが意味不明すぎてどこをどう直せばいいのかわからんのです…。

やりたいこと

コピーOKなクラスAと、コピーNGな(Uncopyable(※1)を継承)クラスBを多重継承した、クラスCを定義(※2)します。このオブジェクトを例外で投げる(main() のthrow C(); の部分)ということがしたいのです。

その際g++ 4.3.2は何も言わないし、できた実行ファイルも正常に動作もしますが、VC++ 2010は「そんなことはできねーよ!」とお怒りになり、コンパイルエラーにされてしまいます。

パターン1(g++ はOK、VC++ はエラー)

A <-----------------+-- C
Uncopyable <-- B <--'

しかし、クラスBを取っ払って、下記のように多重継承したクラスDを使うとVC++ も文句を言わなくなります。

パターン2(g++ はOK、VC++ もOK)

A <-----------------+-- D
Uncopyable <--------'

(※)Uncopyableクラスは、boost::noncopyableのコピペにデバッグメッセージを追加しただけのクラスです。

(※2)コピーOKとコピーNGを多重継承するなんて、コピーOKなのかNGなのか矛盾してますよ、テメーの設計はおかしいですよ。という突っ込みはその通りなのですが、今は設計の話ではないので無視して進めてます。

コード

コードは下記の通りです。先頭の #define USE_CLASS_Cを有効にするとパターン1、コメントアウトなどして無効にするとパターン2となります。

g++ では通るけどVC++ 2010だとエラー

#include <iostream>
#include <cstdio>

//#define USE_CLASS_C

class Uncopyable {
protected:
	Uncopyable() {
		std::cout << "Uncopyable::Uncopyable()" << std::endl;
	}
	~Uncopyable() throw() {
		std::cout << "Uncopyable::~Uncopyable()" << std::endl;
	}
	
private:
	Uncopyable(const Uncopyable&);
	const Uncopyable& operator=(const Uncopyable&);
	
};

class A {
public:
	A() {
		std::cout << "A::A()" << std::endl;
	}
	virtual ~A() {
		std::cout << "A::~A()" << std::endl;
	}
	
	virtual const char *func() {
		return "A";
	}
};

class B : private Uncopyable {
public:
	B() {
		std::cout << "B::B()" << std::endl;
	}
	virtual ~B() {
		std::cout << "B::~B()" << std::endl;
	}
};

#ifdef USE_CLASS_C
class C : public A, public B {
public:
	C() : A(), B() {
		std::cout << "C::C()" << std::endl;
	}
	virtual ~C() {
		std::cout << "C::~C()" << std::endl;
	}
	C(const C& c) : A(), B() {
		std::cout << "C::C(const C& c)" << std::endl;
	}
	
	virtual const char *func() {
		std::cout << "C::func()" << std::endl;
		return "C";
	}
};
#else
class D : public A, private Uncopyable {
public:
	D() : A(), Uncopyable() {
		std::cout << "D::D()" << std::endl;
	}
	virtual ~D() {
		std::cout << "D::~D()" << std::endl;
	}
	D(const D& d) : A(), Uncopyable() {
		std::cout << "D::D(const D&)" << std::endl;
	}
	
	virtual const char *func() {
		std::cout << "D::func()" << std::endl;
		return "D";
	}
};
#endif

int main(int argc, char *argv[])
{
	try {
		std::cout << "try0" << std::endl;
#ifdef USE_CLASS_C
		throw C();
#else
		throw D();
#endif
	} catch (A& e) {
		std::cout << "catch0" << std::endl;
		std::cout << "---- " << e.func() << std::endl;
	}

	getchar();
}

コピペするのすら面倒くさい方のために、link コードとVC++ のプロジェクトファイルを固めたものを置きます。全コードの著作権は放棄しますが、Uncopyableクラスはboostライブラリboost::noncopyableの派生物です。

VC++ のエラーは意味がわかりません

コンパイルと実行結果は下記の通りです。

パターン1 VC++(エラー)、g++(OK)、パターン2 VC++(OK)、g++(OK)の順に、コンパイル結果と、実行結果を連続して掲載しています。

まずはUncopyableを直接継承していないパターン(パターン1)です。VC++ の結果です。

VC++ 2010、パターン1(エラー)
1>------ ビルド開始: プロジェクト: noncopyable, 構成: Debug Win32 ------
1>  a.cpp
1>y:\projects\c\test\test_noncopyable\a.cpp(55): error C2248: 'Uncopyable::Uncopyable' : privateメンバー (クラス 'Uncopyable' で宣言されている) にアクセスできません。
1>          y:projectsctesttest_noncopyablea.cpp(17) : 'Uncopyable::Uncopyable' の宣言を確認してください。
1>          y:projectsctesttest_noncopyablea.cpp(7) : 'Uncopyable' の宣言を確認してください。
1>          コンパイラでのこの診断により関数 'B::B(const B &)' が生成されました。
========== ビルド: 0正常終了、1失敗、0更新不要、0スキップ ==========

次にg++ の結果です。

g++ 4.3.2、パターン1(OK)
$ g++ -Wall -DUSE_CLASS_C a.c -o c.out
$ ./c.out
try0
A::A()
Uncopyable::Uncopyable()
B::B()
C::C()
catch0
C::func()
---- C
C::~C()
B::~B()
Uncopyable::~Uncopyable()
A::~A()

次、クラスBを継承ツリーから省いてUncopyableを直接継承しているパターン(パターン2)です。VC++ の結果です。

VC++ 2010、パターン2(OK)
try0
A::A()
Uncopyable::Uncopyable()
D::D()
catch0
D::func()
---- D
A::a = 0
D::~D()
Uncopyable::~Uncopyable()
A::~A()

次にg++ の結果です。

g++ 4.3.2、パターン2(OK)
$ g++ -Wall a.c -o d.out
$ ./d.out
try0
A::A()
Uncopyable::Uncopyable()
D::D()
catch0
D::func()
---- D
D::~D()
Uncopyable::~Uncopyable()
A::~A()

な、なぜだ…。一体、何が間違っているというのだ…。

編集者:すずき(2014/09/19 01:21)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2010年6月25日

もうだめだな

携帯を毎朝フル充電しているにも関わらず、会社に着くまでには電池残量不足で電源が切れます。

電車内ではiチャネルでニュース見てるだけなんですけど、数ページ見ただけで残量が減っていき、一瞬で電池残量不足になります。全く使い物になりませぬ!

電池パックを取り出して見るとお餅のように丸くなっています。電池パックのあまりの丸さに、裏の蓋もなかなか閉まらないくらいです。こりゃもう寿命だなー。

編集者:すずき(2010/07/07 00:40)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2010年6月30日

ひらメソッド

私がLinux Kernelを読む際は、いわゆるひらメソッドで読み進めています。

ただ、ソースコードの部分はあえてブロックにして区別するなど、書式はかなり変えてます。例えばこんな感じlinux-2.6.33/__EXPORT_SYMBOL()です。

その際に補助ツールとして、以前紹介(2008年2月6日の日記参照)したリンクをバックトレースするプラグイン(#backlinks)と、PukiWikiでブロック表示させるために、ソースコードの行頭にスペースを入れるツールを自作しました。

これでも大きな問題はないのですが、別の関数、シンボルへのリンク作成を手で作るのは面倒くさいし、間違いも起きやすいです。

理想はgtagsのように各関数、シンボルへのリンクは自動で作ってくれることです。それでいて自分のコメントも書き込めるようになっていればGood です。

どこかにそういうツールありませんかね…。

編集者:すずき(2010/07/07 01:00)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2010年7月4日

新居

新居の鍵をもらってきました。でもまだ家電が何もない、電灯すらない、のでまだ住めませんけども。

今日は家のマスターキーを2本もらう予定だったのですが、何があったのか1本だけ鍵がひん曲がっていました。

不動産屋さんに曲がってますぜーって言ったら、大家さんのもっているキーと交換してくれるそうです。僕はそれで良いですけど、大家さんは曲がった鍵のままでいいんだろうか?という疑問が沸いたけど、まあ、向こうが良いと言ってるんだから別に良いか。

というわけで今日は鍵1本だけもらって帰りました。ニュー鍵は後日に新居に持ってきてくれるようです。

編集者:すずき(2010/07/07 00:07)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2010年7月5日

スリープと仮想マシン

Windows 7というかVistaくらいからWindowsの起動がとっても遅くなってしまったため、スリープを積極的に使っています。

コールドスタートと比較したらスリープの起動(復旧?)時間はほぼゼロですし、スリープ時の状態が全部復元されますので、とても便利です。今まで使っておらずちょっともったいなかったと思います。

ただ1つ困る点があって、仮想マシンの時計が盛大に狂うのです。

PCはスリープ中も時計が進んでいるので、スリープから復旧しても時計は正しい時刻を指していますが、仮想マシンの場合はスリープ中に時計を進める術がなく、スリープから復旧するとスリープ時の時刻のままです。

時刻を直すのは何も難しいことはなくdateコマンドとかntpで時刻合わせするだけですが、どうも直し忘れます。

忘れたまま作業をする、例えばリポジトリにコミットなんかしちゃうと、平日の昼間やら誰も起きていない深夜やら、訳のわからない時間でコミットログが残ってしまいます。

他人と共同作業をしているなら別ですが、個人利用しているだけなら、多少時計が遅れたところでこれといった害はないです。まあ、あまりにも変な時間になるのでちょっと気になるかな…ってくらいかな?

編集者:すずき(2010/07/06 23:59)

コメント一覧

  • hdkさん(2010/07/07 00:24)
    以前職場で VirtualBox を使っていた時は、Guest Additions を入れたら、ホスト OS の時計と同期されるようになってたのでそれで使ってました。毎日ハイバネーションしてましたが、Windows XP のハイバネーションがしょぼくて長く使っていると調子が悪くなってくること以外は、特に問題なかったと思います。
  • すずきさん(2010/07/07 00:29)
    >hdkさん
    あれ、私もそうしていたはずなのですが…、設定見直しておきます。

    あと関係ないけど、昔の VirtualBox は、ホストの時計と同期するけど勝手に UTC と解釈してくださりやがって、常に 9時間ずれてた悲しい思い出があります。
  • hdkさん(2010/07/07 00:43)
    職場で使ってたのは 1.6 とかの時代なので今は変わっているところもあるかも...

    GNU/Linux ゲストだと時計はどっちでも設定でなんとかなります。Windows だとどうするんだろうなぁ。
open/close この記事にコメントする



2010年7月6日

ニュー鍵

先日受け取れなかったもう一本のマスターキーを取りに行きました。普通にポストに入っていて、別段おもしろいことはありませんでした。

未だに新居がどこにあるのか良くわかんねーですよ。今日も新居を目の前にして「新居はどこだ?」って地図みながらウロウロしてましたし。

住んでいればそのうち覚えられるだろうと踏んでますが、新居近辺は道が細くて複雑なので、あまり自信ないですな…。

灼熱

せっかく新居に来たついでに、家の壁や天井の高さを測ってきました。冷蔵庫と洗濯機を買うときのためです。

さらに張り切って、窓のサイズ(カーテン用)やら、流し台のサイズ(コンロ用)なんかも測ってきましたが、そしたらもう汗だく。

外は夜とはいえ、カーテンもなく、窓を締め切った新居はとにかく暑い、の一言に尽きます。

クーラーのない部屋で動き回るのがこれほどつらいとは思いませんでした。クーラーは多少張ってでも、良い奴を買うべき、と決心しました。

編集者:すずき(2010/07/07 00:24)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2010年7月10日

何も持っていなかった

新居で使用する生活家電を買いました。友人達とともになんばのLABI1に行きました。

まず絶対必要な家電は、電灯、洗濯機、掃除機、夏到来を考えて、エアコン、冷蔵庫です。時間の都合上、掃除機、電灯は後日にします。

炊飯器、レンジ、ポットなどもいずれ必要でしょうが、後で大下さんの意見を聞いて揃えることにします。

現在の住居はエアコン、電灯備え付けなので、私所有の家電は何一つありません。というわけで上記、全て新規購入です。

大阪名物

エアコン2台と冷蔵庫、洗濯機で、総額にするとものすごい金額になります。友人が値切り倒してくれたおかげで、だいぶ安く手に入り、とても助かりました。大阪では値切るのが当たり前と聞いてはいましたが、徹底していて感心しました。

カードで払いも可能でしたが、ただでさえ低い限度額を一瞬でぶっちぎりそうだったので、ニコニコ現金払いにしました。

現金なら限度額ないから安心だよね!って思っていたら、なんとATMの引き出し限度にぶち当たって金が引き出せなくなりました。「限度額に達しているのでこれ以上取引できません」なんてメッセージ、初めて見たね。

予想外のATM限度額に、友人に金を借りて払うという格好悪い羽目に…。あーあ…。

編集者:すずき(2010/07/13 23:50)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2010年7月11日

携帯買い換え

4年以上使ったN902iSからP-03Bにしました。土曜日に6年使ったと言ってましたが、すまん、ありゃ嘘でした。本当は4年でした。

よく考えたら6年前の2004年にですね、2006年夏モデルである902iSシリーズが買えるわけありません。日記を見直すと、以下が真実のようです。

  • 2004年にF506iを買いました。2年でバッテリーが潰れました。
  • 2006年にN902iSを買いました。これも2年でバッテリーが死亡。
  • 2008年にN902iSのバッテリー交換をしました。これもまた2年でバッテリー死す。

FOMA時代のまっただ中、相当粘って使っていたmovaを完全に忘れ去っていたあたり、我ながら酷い記憶違いだと思います。いやまあ…そんなこと誰も気にしてないからいいっちゃあいいんですけど。

そういえば携帯電話のLi-ionバッテリーの寿命は2年といいます。機種も容量も違うのに何の根拠があって2年なんだ?と思っていたのですが、私の携帯変遷を見る限り、見事に2年おきに潰れています。つまり次回は2012年ってことね。

歌舞伎

大下さんと歌舞伎を見に行きました。
何言ってるか聞き取れなくて寝てしまうのではないか?と心配でしたが、そんなことはなくて面白かったです。全体的に古風な物言いですが、言ってることはわかります。

不安であればイヤホンガイドという解説が流れる無線機を貸してくれます(600円だったかな?)。私は番附という演目のストーリー説明、役者の紹介などをしている冊子(1,500円)を買って、ストーリーの解説を読みながら見ていました。

歌舞伎は大抵が大長編なので一部(今回は9話編成のうち、5, 6, 7, 9話を演じていた)だけ上演されることが多いそうです。全部やったら朝になってしまうので仕方ないところです。

この方法の利点は、長編の中でも特に面白い話、見所のある話だけを上演してくれるので、おいしいとこ取りができることです。難点は突然出てくる人々が一体どういう役柄なのかさっぱりわからない…予習か解説併読が必須、ってことですかね。

もし伝統芸能に興味があるなら、入り口として歌舞伎を選ぶのもありなんじゃないかと思いました。明治で廃れてしまい、今もなお敷居の高さを感じる歌舞伎ですが、江戸時代には派手な演技、独特の踊りで、庶民向けに人気を博した芸能だったようです。

編集者:すずき(2010/07/13 23:21)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2010年7月13日

原因はわからない

たまに耳鳴りがします。なぜ耳鳴りと断じているかというと、顔を左右に振っても、後ろを向いても、耳をふさいでも同じ方向(左側)から音がするからです。

頻度や間隔はまちまちです。毎日聞こえるわけでもなく一週間くらい何もないときもあるし、たとえ聞こえたとしても数十秒〜長くて1分〜2分です。

聞こえる音は「ピーー」という音です。10kHz〜 のSin波が近い音ですが、微妙に違います。綺麗な耳鳴り…というのも我ながら表現がおかしいと思いますが、とかく鮮明に聞こえます。

昔からこうだったので、あまり気にしていませんが、最近は音のはっきり感が増している気がします。なんか病気なんですかね??

編集者:すずき(2010/07/14 00:14)

コメント一覧

  • ママ@ふふっ。さん(2010/07/14 00:30)
    グタグタいってないで、
    はやく病院へいってください!!
    ひどくなったらこまりますよ。
  • hdkさん(2010/07/14 01:44)
    常に耳鳴りがします。15kHz〜の「キーン」という感じ。意識すればいつでも聞けます... 昔からこうでした。

    それとは別に、そういう「ピー」音も時々聞こえる気がします。なんなんでしょうねぇ。
  • すずきさん(2010/07/14 21:04)
    >ママ@ふふっ。さん
    あまり困っていない状態で、病院にいくと大抵、
    自分「たまに耳鳴りがするんですけど…」
    医者「ふーん…」(そんなんで来るんじゃねーよ、邪魔くさ!)
    って顔されるので、困ったら行くことにします。

    >hdkさん
    そういえば静かな部屋でじっとしているとキーンという音がしますね。
open/close この記事にコメントする



link もっと前
2010年6月16日 >>> 2010年7月13日
link もっと後

管理用メニュー

link 記事を新規作成

<2010>
<<<06>>>
--12345
6789101112
13141516171819
20212223242526
27282930---

最近のコメント5件

  • link 24年6月17日
    すずきさん (06/23 00:12)
    「ありがとうございます。バルコニーではない...」
  • link 24年6月17日
    hdkさん (06/22 22:08)
    「GPSの最初の同期を取る時は見晴らしのい...」
  • link 24年5月16日
    すずきさん (05/21 11:41)
    「あー、確かにdpkg-reconfigu...」
  • link 24年5月16日
    hdkさん (05/21 08:55)
    「システム全体のlocale設定はDebi...」
  • link 24年5月17日
    すずきさん (05/20 13:16)
    「そうですねえ、普通はStandardなの...」

最近の記事3件

  • link 24年6月27日
    すずき (06/30 15:39)
    「[何もない組み込み環境でDOOMを動かす - その4 - 自作OSの組み込み環境へ移植] 目次: RISC-V目次: 独自OS...」
  • link 22年12月13日
    すずき (06/30 15:38)
    「[独自OS - まとめリンク] 目次: 独自OS一覧が欲しくなったので作りました。自作OSの紹介その1 - 概要自作OSの紹介...」
  • link 21年6月18日
    すずき (06/29 22:28)
    「[RISC-V - まとめリンク] 目次: RISC-VSiFive社ボードの話、CoreMarkの話のまとめ。RISC-V ...」
link もっとみる

こんてんつ

open/close wiki
open/close Linux JM
open/close Java API

過去の日記

open/close 2002年
open/close 2003年
open/close 2004年
open/close 2005年
open/close 2006年
open/close 2007年
open/close 2008年
open/close 2009年
open/close 2010年
open/close 2011年
open/close 2012年
open/close 2013年
open/close 2014年
open/close 2015年
open/close 2016年
open/close 2017年
open/close 2018年
open/close 2019年
open/close 2020年
open/close 2021年
open/close 2022年
open/close 2023年
open/close 2024年
open/close 過去日記について

その他の情報

open/close アクセス統計
open/close サーバ一覧
open/close サイトの情報

合計:  counter total
本日:  counter today

link About www.katsuster.net
RDFファイル RSS 1.0

最終更新: 06/30 15:39