スポンサーリンク

20 件 見つかりました。

1. [2013-10-30-1]

C++ auto type specifier is a C++11 extension[c++]

このドキュメントの内容は、以下の通りです。はじめに解決策はじめにC++ のコードを clang でコンパイルしたら、以下の警告が出ました。コンパイルができているのですが、警告が出るのは、イヤです。'auto' type specifier is a C++11 extension解決策clang++ -std=c++11 foo.cpp
2. [2013-07-22-1]

C++ error invalid in-class initialization of static data member of non-integral type const char*[c++]

このドキュメントの内容は、以下の通りです。はじめに修正方法はじめにC++ の古いコードを修正しなければならなかったので、修正しました。問題になったコードは、こんな感じです。class の private に static なメンバがいます。static メンバは、宣言部分で初期化できません。class C {private:static const char *ptr = "hoge";};このようなエラーになります。% g++ static_member.ccstatic_member.cc:3: error: invalid in-class initialization of static data member of non-integral type 'const char*'修正方法class の宣言部分では、初期化をせず、初期化は、class 宣言の外で行います。class C {private:static const char *ptr;};const char * C::ptr = "hoge";
3. [2013-07-17-1]

C++ deprecated conversion from string constant to char*[c++]

このドキュメントの内容は、以下の通りです。はじめに問題になったコード解決策はじめに古い C++ のメンテナンスしていたら、下記のエラーが出ました。deprecated conversion from string constant to 'char*'問題になったコード#define D "a"class foo {foo () : a(D) {}char *a;}解決策char * のメンバが気に入らなかったようなので、 const をつけるだけで対応できました。#define D "a"class foo {foo () : a(D) {}const char *a;}以上です。
4. [2013-07-16-1]

C++ error extra qualification foo:: on member bar[c++]

このドキュメントの内容は、以下の通りです。はじめに問題点解決策はじめにC++ の古いソースコードをメンテナンスしました。古いコンパイラでは、エラーになってなかったのですが、新しい環境では、下記のエラーが出ました。foo.h:2: error: extend qualification 'foo::' on member 'bar'問題点foo.h では、下記のコードが記載されていました。class foo {void foo::bar ();}なぜ、こんなコードを書いたのでしょう、って感じです。解決策foo:: は、不要なので削除します。class foo {void bar ();}以上です。
5. [2013-03-23-1]

C++を書いてたらSegmentation Faultした[C++]

このドキュメントの内容は、以下の通りです。はじめになにが悪かったのかはじめに最近、C++を書いていたら、Segmentation fault が起きた。Cでも同じことやった、Segmentation fault になる。なにが悪かったのかありもしない添字で std::vector にアクセスしてしまったのが問題だった。% にしないといけないのに / にしていたのが間違いだった。index = size / max;index = size % max;余りの値が必要だったのに、商を求めてしまっていた。よくありそうな間違いな気がします。
6. [2013-03-10-1]

std thread がlibstdc++.so.6 version GLIBCXX_3.4.1でコケる[C++][thread]

このドキュメントの内容は、以下の通りです。はじめにFreeBSDでコンパイルして実行CentOSでコンパイルして実行はじめにC++でstd::threadをつかってみようと思って、ためしてみた。でも、FreeBSDとCentOSの両方でうまくいかない。FreeBSDでコンパイルして実行gcc48 をインストールして、g++48を利用してコンパイルしてみた。$ g++48 -std=gnu++0x std_thread1.cpp$ ./a.out/usr/lib/libstdc++.so.6: version GLIBCXX_3.4.11 required by /home/foo/a.out not found[2]85939 exit 1 ./a.outrpath をつけてみた。% g++48 -std=c++11 std_thread1.cpp -I/usr/local/lib/gcc48/include/c++ \-I/usr/local/lib/gcc48/include/ -L/usr/local/lib/gcc48 -Wl,-rpath=/usr/local/lib/gcc48/% ./a.outEnable multithreading to use std::thread: Operation not permittedCentOSでコンパイルして実行$ g++ -std=gnu++0x std_thread1.cpp$ ./a.out[1] 28745 segmentation fault (core dumped) ./a.out
7. [2013-03-02-1]

Eclipse CDTでC++を書く[Eclipse][C++]

このドキュメントの内容は、以下の通りです。はじめにEclipse CDTのダウンロードソフトウェアのインストールコンパイラ関係をインストールはじめにC++ を書くにあたって、統合開発環境が欲しかったので、 Eclipse の CDT (C/C++ Development Toolking) をひさびさに使ってみることにしました。今回のセットアップは、Windowsで行いました。Eclipse CDTのダウンロードまずは、 Eclipse のダウンロードからです。http://www.eclipse.org/cdt/ソフトウェアのインストールEclipse を起動し、ヘルプの「新規ソフトウェアのインストール」を選択します。「作業対象(w)」を下記に設定します。Junohttp://download.eclipse.org/releases/junoProgrammng Languages (もしくは、プログラミング言語)を探します。その中の「C/C++ Development Tools」にチェックを入れます。次へ、を押して、インストールします。コンパイラ関係をインストールWindows 環境に g++ などをインストールします。c++ のヘッダファイルなども必要なので、インストールしました。WinGWMSYSmsysDTK
8. [2013-02-11-1]

C++ boost foreach.hpp expected primary-expression before[C++][boost]

このドキュメントの内容は、以下の通りです。コンパイルエラーで困ったコンパイルエラーで困ったちょっと適当にC++のコードを書いていました。関数の途中で include したりしました。intmain (int argc, char *argv[]){#include <boost/foreach.hpp>return 0;}すると、なんいうことでしょう。コンパイルエラーです。In file included from /usr/local/include/boost/mpl/if.hpp:17,from /usr/local/include/boost/foreach.hpp:71,from main.cpp:137:/usr/local/include/boost/mpl/aux_/value_wknd.hpp: In function 'int main()':/usr/local/include/boost/mpl/aux_/value_wknd.hpp:73: error: expected primary-expression before 'namespace'/usr/local/include/boost/mpl/aux_/value_wknd.hpp:73: error: expected `;' before 'namespace'main.cpp:159: error: expected `}' at end of inputmain.cpp:159: error: expected `}' at end of inputmain.cpp:159: error: expected `}' at end of inputmain.cpp:159: error: expected `catch' at end of inputmain.cpp:159: error: expected `(' at end of inputmain.cpp:159: error: expected type-specifier at end of inputmain.cpp:159: error: expected `)' at end of inputmain.cpp:159: error: expected `{' at end of inputmain.cpp:159: error: expected `}' at end of input*** Error code 1結局、ソースファイルの上位部分に include 文をもっていくことで解決しました。
9. [2013-02-10-1]

C++ name lookup of 'it' changed for new ISO 'for' scoping[C++]

このドキュメントの内容は、以下の通りです。エラーメッセージエラーメッセージC++ のコードを書いて、GCC g++でコンパイルしたら、以下のメッセージが出ました。C++ name lookup of 'it' changed for new ISO 'for' scopingおかしいな、とおもったら ; がおかしなところについているのが原因でした。for (std::map<std::string, std::vector<ColumnOrSuperColumn> >::iterator it = _return.begin(); it != _return.end(); ++it); // <-- ココ!{std::cout << it->first << std::endl;}
10. [2012-01-16-1]

FreeBSD JsonCpp をマニュアルでコンパイルしてみる[json][C++][jsoncpp]

[2011-10-22-1] で「 FreeBSD で jsoncpp をコンパイルする」方法について書いたんですが、scons が必要だったので、適当に .so をコンパイルしました。[2011-10-21-1] sconsをインストールするダウンロードして、tar.gz を展開します。そのあとは、 g++ で object file を作って、 so を作ります。以下のテストは、 FreeBSD で行いました。wget 'http://sourceforge.net/projects/jsoncpp/files/latest/download'newtar zxfp jsoncpp-src-0.5.0.tar.gzcd jsoncpp-src-0.5.0/cd src/cd lib_json/g++ -c -I ../../include/ -I . *.cppg++ -shared *.o -o libjsoncpp.soshared object ができました。% file *.solibjsoncpp.so: ELF 32-bit LSB shared object, Intel 80386, version 1 (FreeBSD), dynamically linked, not stripped
11. [2011-12-13-1]

C++ コンストラクタに参照を渡す[C++]

このドキュメントの内容は、以下の通りです。コンパイル実行例C++言語で「メンバに参照を持つクラス」をメンバに持つクラスを初期化する方法について。C はデータクラスです。X は、C の参照をメンバに持つクラスです。Y は、X をメンバに持つクラスです。Y は、X のために、C もメンバに持ちます。X のコンストラクタは、C の参照を受け取ります。これを値渡しにするとデストラクタが起動されて、意味不明なことになります。だから、参照が渡されるように & を忘れてはいけません。#include <iostream>#include <cstdlib>#include <string>using namespace std;class C{public:string progname;string conf;C (string p, string c) : progname (p), conf (c){cout << __PRETTY_FUNCTION__ << endl;//cout << progname << endl;//cout << conf << endl;}~C () {cout << __PRETTY_FUNCTION__ << endl;}C (const C& o) {cout << __PRETTY_FUNCTION__ << endl;progname = o.progname;conf = o.conf;//cout << progname << endl;//cout << conf << endl;}void p () {cout << __PRETTY_FUNCTION__ << endl;cout << progname << endl;cout << conf << endl;}};class X{C &c;public:X (C &c1) : c (c1) {cout << __PRETTY_FUNCTION__ << endl;}~X () {cout << __PRETTY_FUNCTION__ << endl;}void p (){cout << __PRETTY_FUNCTION__ << endl;c.p ();}};class Y{C c;X x;public:Y ( string p, string conf ) : c(p,conf), x(c) {cout << __PRETTY_FUNCTION__ << endl;}~Y () {cout << __PRETTY_FUNCTION__ << endl;}void p () {cout << __PRETTY_FUNCTION__ << endl;x.p ();}};void t (char *argv[]){string progname = argv[0];string conf= "foo.conf";Y y ( progname, conf );y.p ();}intmain (int argc, char *argv[]){t (argv);exit (EXIT_SUCCESS);}コンパイルコンパイル方法は、以下の通り。g++ foo.cc実行例プログラムを実行すると以下のようにクラスが作成され、破棄されます。オブジェクトが作られた順番と逆に破棄されます。C::C(std::string, std::string)X::X(C&)Y::Y(std::string, std::string)void Y::p()void X::p()void C::p()./a.outfoo.confY::~Y()X::~X()C::~C()
12. [2011-12-09-1]

C++ std::string に NULL を突っ込むとセグメンテーションフォルト[C++]

std::string に NULL を代入するとセグメンテーションフォルトが起きます。#include <iostream>#include <cstdlib>#include <string>using namespace std;intmain (int argc, char *argv[]){char *p = NULL;string s;s = p;exit (EXIT_SUCCESS);}コンパイルして、実行してみます。% g++ -g s.cc% ./a.outSegmentation faultExit 139gdb してみたら、 std::string の中で libc の strlen を呼び出しているようにみえる。(gdb) runStarting program: /tmp/b.outProgram received signal SIGSEGV, Segmentation fault.0x2828dd2d in strlen () from /lib/libc.so.7(gdb) bt#0 0x2828dd2d in strlen () from /lib/libc.so.7#1 0x280fe7c2 in std::string::operator= () from /usr/lib/libstdc++.so.6#2 0x080489b6 in main () at s3.cc:14
13. [2011-09-09-1]

C++からC言語のライブラリをリンクする undeclared reference to function[C++][C]

C言語で書いたライブラリを C++ のプログラムからリンクしようとしたときに、undefined reference to functionと言われて、コンパイルが通らなかった。C 言語のライブラリのヘッダファイルで、extern "C" してなかったのが原因でした。#ifdef _cplusplusextern "C" {#endifint func ( void );#ifdef _cplusplus}#endif
14. [2010-12-08-1]

C++ デフォルト引数はプロトタイプ宣言だけにする default argument given for parameter[c++]

このドキュメントの内容は、以下の通りです。サンプルコードコンパイルするとデフォルト引数でエラーが出る何が悪いのか?古い g++ でコンパイルするときは、問題にならなかったけど、いつの間にかエラーになってコンパイルできなくなってしまった、というお話です。どういうわけか、古いコンパイラを使わないといけない環境に長いこといたせいか、現代のGNU g++の環境にソースコードを持ってきてコンパイルしようとしたらエラーが続出でびっくりしました。とりあえず、コンパイルしてくれてもいいじゃない?とか思うのですが、そういうわけにもいかないので、いろいろ直すことになりました。サンプルコードたとえば、このようなソースコードを書きます。#include <iostream>#include <cstdlib>using namespace std;void func ( int id = 0 );void func ( int id = 0 ) {return;}intmain (int argc, char *argv[]){func ( );exit (EXIT_SUCCESS);}コンパイルするとデフォルト引数でエラーが出るコンパイルしてみます。% g++ -Wall default_arg.ccdefault_arg.cc: In function 'void func(int)':default_arg.cc:7: error: default argument given for parameter 1 of 'void func(i'default_arg.cc:5: error: after previous specification in 'void func(int)'1で終了しましたg++コンパイラさんが親切にもデフォルト引数が与えられているとか、前に指定しているとか、ゴチャゴチャ言ってきます。何が悪いのか?プロトタイプ宣言部と関数宣言の両方で、デフォルト引数を設定しているのが問題でした。具体的には、この部分です。void func ( int id = 0 );void func ( int id = 0 ) {return;}そもそもこのレベルのプログラムでプロトタイプ宣言しなくてもいいじゃない、というのはなしです。ヘッダファイルに宣言して、ほかのプログラムから利用させるということにしておいてください。プロトタイプ宣言は、関数のパラメータがどうなっているのか、コンパイラにおしえるものなので、こちらにデフォルト引数を指定します。ライブラリとして提供する場合、ライブラリを利用するプログラムは、ヘッダファイルをインクルードして使います。そのときに、デフォルト引数が何個あるのか、知らないとコンパイラが困ります。デフォルト引数として宣言していないと、必ず、引数をセットしないといけなくなります。というわけで、関数宣言部分からデフォルト引数を削除します。void func ( int id = 0 );void func ( int id ) { // ここの id = 0 を id だけにしました。return;}これで問題は、解決しました。
15. [2009-07-23-1]

GNU libstdc++ STLドキュメント[c++][STL]

このドキュメントの内容は、以下の通りです。インストール参考サイトドキュメントlibstdc++のパッケージは、GNU C++のソースとドキュメントです。libstdc++のパッケージをインストールすることで、HTMLのドキュメントを見ることができます。インストールcd /usr/ports/lang/libstdc++_stldoc_3.4.0sudo make install cleanportinstallコマンドでインストールする場合sudo portinstall /usr/ports/lang/libstdc++_stldoc_3.4.0参考サイトhttp://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/index.htmlドキュメントlibstdc++_stldoc_3.4.0 をインストールすると /usr/local/share/doc/libstdc++_stldoc_3.4.0/ にインストールされます。w3mコマンドを使って、ドキュメントを見ることが可能です。w3m /usr/local/share/doc/libstdc++_stldoc_3.4.0/index.htmlドキュメントをApacheで公開するときには、下記のような設定をするとドキュメントのディレクトリをApache経由でアクセスすることが可能になります。Alias /doc//usr/local/share/doc/<Directory "/usr/local/share/doc/">order allow,denyallow from all</Directory>
16. [2009-01-22-1]

wstringを使うときはLが必要なときがあります[c++]

久しぶりにC++を書いてて、wstringに普通に文字列を代入しようとしたら、コンパイラに怒られました。すっかし L の存在を忘れてました。std::wstring s = L"hoge";L は Literal(リテラル)の略です。Visual Studioの場合、設定によって、Lが不要だったりします。ユニコード設定の場合は、 L"文字列"マルチバイト設定の場合は、 "文字列" (Lは不要)
17. [2008-10-22-1]

GoogleのC++ ロギングAPI glogとテストフレームワーク googltest[c++]

Googleから公開されている C++ のロギングAPIを提供する glogとテストフレームワーク googletest が FreeBSD の ports に追加されました。gloghttp://code.google.com/p/google-glog/googltesthttp://code.google.com/p/googletest/glogのインストールcd /usr/ports/devel/glogsudo make install cleangoogletestのインストールcd /usr/ports/devel/googletestsudo make install clean
18. [2007-08-22-1]

CppUnitでC++の例外をテストする方法[cppunit][c++][unittest]

CppUnitはC++用のテスティングフレームワーククラスライブラリで、ユニットテストを行うことができます。C++やCの単体テストを自動化し、簡単に何度もテストすることができます。FreeBSDはportsからcppunitをインストールできます。cd /usr/ports/devel/cppunit/sudo make install cleankcrypt.hテストしたいソースコード。#ifndef KCRYPT_H# define KCRYPT_H#include <exception>#include <stdexcept>#include <string>using namespace std;class kcrypt{private:void isEmpty (const string str, const string name) {if (str.empty () ) {throw invalid_argument (name + " is empty.");}}public:kcrypt () {}~kcrypt () {}void encrypt (const string secret, const string data, string &compute) {this->isEmpty (secret, "secret");this->isEmpty (data, "data");compute = "fake";}};#endif /* KCRYPT_H */test.hテスト用コード#ifndef TEST_H# define TEST_H#include <cppunit/TestCase.h>#include <cppunit/extensions/HelperMacros.h>#include <cppunit/ui/text/TestRunner.h>#include "kcrypt.h"class kcryptTest : public CppUnit::TestFixture {CPPUNIT_TEST_SUITE ( kcryptTest );CPPUNIT_TEST ( test_encrypt_data );CPPUNIT_TEST ( test_encrypt_secret );CPPUNIT_TEST_SUITE_END ();public:void test_encrypt_secret ();void test_encrypt_data ();void setUp () {target = new kcrypt;}void tearDown () {delete target;}void runTest () {}private:kcrypt *target;};#endif /* TEST_H */main.ccテストコード本体#include <iostream>#include <cstdlib>#include <cppunit/ui/text/TestRunner.h>#include "test.h"intmain (int argc, char *argv[]){CppUnit::TestSuite *suite = kcryptTest::suite ();CppUnit::TextUi::TestRunner runner;runner.addTest (suite);bool retcode = runner.run ();return (! retcode);}testKcrypt.cc#include <iostream>#include <cstdlib>#include "test.h"using namespace std;voidkcryptTest::test_encrypt_secret (){try {string compute;target->encrypt ("", "data", compute);CPPUNIT_FAIL ("The exception std::invalid_argument must be throw." );} catch (invalid_argument &e) {CPPUNIT_ASSERT (true);}}voidkcryptTest::test_encrypt_data (){try {string compute;target->encrypt ("secret", "", compute);CPPUNIT_FAIL ("The exception std::invalid_argument must be throw." );} catch (invalid_argument &e) {CPPUNIT_ASSERT (true);}}コンパイル方法g++ -I/usr/local/include -L/usr/local/lib -lcppunit main.cc testKcrypt.ccでもいいけど、 cppunikt-configを使った方がいいかも。g++ `cppunit-config --cflags` `cppunit-config --libs` main.cc testKcrypt.cc問題ないときの実行例% ./a.out..OK (2 tests)問題があるときの実行例throwすべきときにしないときのエラーの例。..F!!!FAILURES!!!Test Results:Run: 2 Failures: 1 Errors: 01) test: kcryptTest::test_encrypt_secret (F) line: 14 testKcrypt.ccforced failure- The exception std::invalid_argument must be throw.
19. [2007-04-13-1]

C++ 文字列を大文字から小文字へ、小文字から大文字へ変換する[c++][文字列]

文字列を大文字から小文字へ変換したり、小文字から大文字へ変換するのに、 transform が使えます。サンプルコード#include <iostream>#include <cstdlib>#include <algorithm>#include <string>intmain (int argc, char *argv[]){std::string s("Yahoo Google");transform (s.begin (), s.end (), s.begin (), toupper);std::cout << s << std::endl;transform (s.begin (), s.end (), s.begin (), tolower);std::cout << s << std::endl;::exit (EXIT_SUCCESS);}コンパイルと実行例。g++ transform.cc./a.outYAHOO GOOGLEyahoo googleC だったら、ポインタをぐるぐる回して、 tolower や toupper しますよね。#include <stdio.h>#include <stdlib.h>#include <ctype.h>#include <string.h>voidstrlower (const char *s){char buf[strlen(s) + 1];char *p = buf;for ( ; *s; s++){*p++ = tolower (*s);}*p = '\0';printf ("%s\n", buf);}intmain(int argc, char *argv[]){strlower ("Yahoo");strlower ("Google");exit (EXIT_SUCCESS);}C++関連記事[2007-08-22-1] CppUnitでC++の例外をテストする方法[2007-08-03-1] vimのオムニ補完でC++をもっと楽にする OmniCppComplete[2007-04-12-2] boost regex 正規表現マッチ
20. [2007-04-12-2]

boost regex 正規表現マッチ[c++]

ときどき、 C++ で正規表現が書きたくなるので、メモ。FreeBSD なら ports からインストールします。cd /usr/ports/devel/boost/sudo make install cleanコンパイル方法g++ regex.cc -lboost_regex -I/usr/local/include -L/usr/local/libサンプルソースコード。#include <iostream>#include <cstdlib>#include <string>using namespace std;#include <boost/cregex.hpp>boolRegMatch (string exp, string data){boost::RegExregexp;regexp.SetExpression (exp.c_str (), true);if (regexp.Match (data.c_str () ) ) {return (true);} else {return (false);}}intmain (int argc, char *argv[]){string exp = ".+\.avi$";string filename = "a.avi";if (RegMatch (exp, filename) ) {cout << "match" << endl;} else {cout << "not match" << endl;}::exit (EXIT_SUCCESS);}C++関連記事[2007-08-22-1] CppUnitでC++の例外をテストする方法[2007-08-03-1] vimのオムニ補完でC++をもっと楽にする OmniCppComplete[2007-04-13-1] C++ 文字列を大文字から小文字へ、小文字から大文字へ変換する
スポンサーリンク