ページ 11

2か所でインクルードするとエラー

Posted: 2012年12月23日(日) 11:59
by gran
プログラム勉強中のgranです。よろしくお願いします。

昨日この掲示板で作れたクラスがあります。

コード:

//---------------------------------------------------------------------
// File: trans.h
// 文字変換クラス
//---------------------------------------------------------------------
#ifndef INCLUDED_TRANS
#define INCLUDED_TRANS
#pragma once

#include <sstream>

//---------------------------------------------------------------------
// ワイド文字列への変換
// toWstring( 変えたい値 )
//---------------------------------------------------------------------
template<class T>
std::wstring toWstring(T val)
{
	std::wstringstream wss;							// 箱を生成
	wss << val;								// 値を入れる

	return wss.str();								// 文字列にして返す
}

#endif
このtrans.hを2か所で使いたいとき
2か所でインクルードすると
「既に定義されています」というエラーが出ました。

2か所で使いたい場合ふつうどうするものなのでしょう。
私が知っている方法はクラス化ぐらいしかありません。

どなたかよろしくお願いします。

Re: 2か所でインクルードするとエラー

Posted: 2012年12月23日(日) 12:17
by h2so5
「インクルードガード」で検索してください

Re: 2か所でインクルードするとエラー

Posted: 2012年12月23日(日) 12:22
by とっち
1. namespaceを使う

2. inlineを使う

コード:

template<class T> inline std::wstring toWstring(T val){
    std::wstringstream wss;                         // 箱を生成
    wss << val;                             // 値を入れる
 
    return wss.str();                               // 文字列にして返す
}
私が思いつくのはこれくらいでしょうか

Re: 2か所でインクルードするとエラー

Posted: 2012年12月23日(日) 12:23
by softya(ソフト屋)
インクルードガードは、行われているみたいなので特に問題無いですけどね。
temp.hが問題のテンプレート関数です。問題なくコンパイル実行できます。

コード:

// main.cpp
#include <iostream>
#include "temp.h"

void sub();

int main()
{
	std::wstring ws = toWstring(1);
	std::wcout << ws;
	sub();
}

// sub.cpp
#include <iostream>
#include "temp.h"

void sub()
{
	std::wstring ws = toWstring("aa");
	std::wcout << ws;
}
よく考えてみると、まずそうな気がする。
inlineが一番良いかも。

Re: 2か所でインクルードするとエラー

Posted: 2012年12月23日(日) 12:43
by gran
3名の方返信ありがとうございます。

>h2so5さん
昨日に引き続きありがとうございます。
インクルードガードはしています。
コード見てから返信していただけたら
良いと思います。

>とっちさん
参考になりました。
namespaceいいと思いました。
inline関数は発想になかったです。
調べてみると
インライン関数は本体(?)に埋め込まれ
マクロのように使用出来て、
関数を呼んでも時間がかからないというものでした。
大きなプログラムを作っているのでこちらを使いたいと
思います。ありがとうございました。

>soft屋さん
昨日に引き続きありがとうございます。
上記のとおりインライン関数を使用しました。

いいコードがかけたと思ったのでこれにて
解決にします。
ありがとうございました。

Re: 2か所でインクルードするとエラー

Posted: 2012年12月23日(日) 12:44
by gran
すいませんが、解決のチェックボックスが押せてなかったようなので
無駄に1レス追加します。

Re: 2か所でインクルードするとエラー

Posted: 2012年12月23日(日) 14:55
by かずま
gran さんが書きました:昨日この掲示板で作れたクラスがあります。
クラスは作っていません。
trans.h の中に書かれている toWstring は、
「関数テンプレート」であって、「クラス」ではありません。
クラスのメンバ関数でもありません。