月曜日, 7月 04, 2016

g++: テンプレートを使う場合の分割コンパイル

テンプレートを使う場合、実装を別ファイルで行うとややこしくなります。

こんなテンプレートを使うヘッダーファイルがあったとします。

template <class T> class A
{
public:
int a;
A();
};
view raw header.h hosted with ❤ by GitHub

ここで、別ファイルで実装します。

#include "header.h"
template <class T> A<T>::A()
{
a=0;
}
view raw a.cpp hosted with ❤ by GitHub

このヘッダーファイルをインクルードして、別ファイルで呼び出すとリンカがエラーを出します。

#include <iostream>
#include "header.h"
using namespace std;
int main()
{
A<int> a;
cout << a.a << endl;
return 0;
}
view raw main.cpp hosted with ❤ by GitHub

ヘッダーファイルで実装すると問題は解決です。

template <class T> class A
{
public:
int a;
A()
{
a=0;
}
};
view raw header-new.h hosted with ❤ by GitHub

Qt: 外部プログラムを起動する

  Qt/C++ のアプリは、外部へ直接アクセスできます。これはネットアプリでは不可能な Qt のメリットです。 外部プログラムを起動することもできます。QProcess::startDetached() を使うと独立したプロセスを立ち上げることができます。 この QProces...