コグノスケ


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

link もっと前
2010年6月25日 >>> 2010年6月12日
link もっと後

2010年6月25日

もうだめだな

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

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

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

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

コメント一覧

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



2010年6月16日

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

目次: C言語とlibc

(説明は後述)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()

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

編集者:すずき(2025/06/09 01:10)

コメント一覧

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



link もっと前
2010年6月25日 >>> 2010年6月12日
link もっと後

管理用メニュー

link 記事を新規作成

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

最近のコメント5件

  • link 24年6月17日
    すずきさん (06/05 23:32)
    「Thnaks for your info...」
  • link 24年6月17日
    Bobさん (06/04 09:25)
    「BindIPv6Only=no does...」
  • link 18年8月12日
    すずきさん (05/29 16:57)
    「コメントありがとうございます。\n\nこ...」
  • link 18年8月12日
    ARM926EJ-Sさん (05/29 14:27)
    「この記事が書かれたのは2018年ですが、...」
  • link 17年9月3日
    すずきさん (05/26 23:59)
    「>ちょさんさん\nご参考になれば幸いです...」

最近の記事20件

  • link 21年12月28日
    すずき (06/22 23:33)
    「[ゲーム - まとめリンク] 目次: ゲーム一覧が欲しくなったので作りました。Wizardry(囚われし亡霊の街)敵が強すぎる...」
  • link 25年6月19日
    すずき (06/22 23:33)
    「[歴代据え置きハードのCPUとGPU] 目次: ゲーム最近、据え置きハードのCPUとGPUがNVIDIAとAMDに収束していま...」
  • link 25年6月18日
    すずき (06/22 23:33)
    「[Nintendo Switch 2当選] 目次: ゲームSwitch 2の抽選4回目で当選してました。わーい。今回も落選だっ...」
  • link 10年4月17日
    すずき (06/13 21:41)
    「[何もしていないのに負荷が高いWindows 7] 目次: WindowsWindows 7は何もしていなくても常時CPU負荷...」
  • link 23年9月11日
    すずき (06/12 02:52)
    「[Windows - まとめリンク] 目次: Windows使いづらいWindows 7のエクスプローラ何もしていないのに負荷...」
  • link 10年4月10日
    すずき (06/12 02:52)
    「[使いづらいWindows 7のエクスプローラ] 目次: Windows週末を利用して旧マシンを葬って、新マシンを立ち上げまし...」
  • link 10年4月23日
    すずき (06/12 02:49)
    「[Windows 7のオーディオ処理負荷] 目次: Windows先日の日記(2010年4月17日の日記を参照)で書いたWin...」
  • link 10年4月25日
    すずき (06/12 02:48)
    「[Windows 7のサウンド機能は辛いよ] 目次: WindowsWindows Vista/7はサウンド周りがXPの頃と比...」
  • link 10年5月11日
    すずき (06/12 02:46)
    「[Sound Blaster X-Fiの話の訂正] 目次: Windows以前(2010年5月4日の日記を参照)書いた内容の訂...」
  • link 10年5月4日
    すずき (06/12 02:45)
    「[Sound Blaster X-Fiのサウンド設定いじってばっかり] 目次: Windows今使っているPCで激しく失敗した...」
  • link 10年5月12日
    すずき (06/12 02:43)
    「[Sound Blaster X-Fiのドライバが劣化] 目次: WindowsWindows UpdateにてCreativ...」
  • link 25年6月7日
    すずき (06/12 00:28)
    「[THPを一時的に無効にする方法] 目次: Linux何か訳があってLinuxのTHP(Transparent HugePag...」
  • link 25年6月6日
    すずき (06/11 00:49)
    「[新しめのRaspberry Pi OS LiteをQEMUで使う] 目次: Linux以前(2022年2月2日の日記参照)、...」
  • link 23年4月10日
    すずき (06/11 00:48)
    「[Linux - まとめリンク] 目次: Linux関係の深いまとめリンク。目次: RISC-V目次: ROCK64/ROCK...」
  • link 23年5月15日
    すずき (06/10 15:39)
    「[車 - まとめリンク] 目次: 車三菱FTOの話。群馬県へのドライブ1群馬県へのドライブ2将来車を買い替えるとしたら?FTO...」
  • link 22年1月22日
    すずき (06/10 15:38)
    「[バッテリーなんですぐ死んでしまうん?] 目次: 車正月、北海道から帰ってきて車の様子を見たら、完全にバッテリーが上がっていま...」
  • link 13年3月20日
    すずき (06/10 15:35)
    「[車が故障した(Er HC)] 目次: 車今朝、同期の人たちと梅見に行くため車で出発しようとしたのですが、キーをSTARTまで...」
  • link 16年5月1日
    すずき (06/09 03:10)
    「[自作ARMエミュレータでLinux 4.4が動かなかった] 目次: LinuxLinux 4.4系がLongtermの仲間入...」
  • link 16年4月30日
    すずき (06/09 03:08)
    「5月1日と全く同じ内容を書いていたので削除。...」
  • link 17年1月5日
    すずき (06/09 02:56)
    「[ノートPCのメモリが足りない] 目次: PC我が家のノートPC(Lenovo ThinkPad Edge E420, Win...」
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 2025年
open/close 過去日記について

その他の情報

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

合計:  counter total
本日:  counter today

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

最終更新: 06/22 23:33