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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
gran

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

#1

投稿記事 by gran » 12年前

プログラム勉強中の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か所で使いたい場合ふつうどうするものなのでしょう。
私が知っている方法はクラス化ぐらいしかありません。

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

アバター
h2so5
副管理人
記事: 2212
登録日時: 14年前
住所: 東京
連絡を取る:

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

#2

投稿記事 by h2so5 » 12年前

「インクルードガード」で検索してください

とっち
記事: 56
登録日時: 13年前
住所: 岡山

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

#3

投稿記事 by とっち » 12年前

1. namespaceを使う

2. inlineを使う

コード:

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

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

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

#4

投稿記事 by softya(ソフト屋) » 12年前

インクルードガードは、行われているみたいなので特に問題無いですけどね。
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が一番良いかも。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

gran

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

#5

投稿記事 by gran » 12年前

3名の方返信ありがとうございます。

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

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

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

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

gran

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

#6

投稿記事 by gran » 12年前

すいませんが、解決のチェックボックスが押せてなかったようなので
無駄に1レス追加します。

かずま

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

#7

投稿記事 by かずま » 12年前

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

閉鎖

“C言語何でも質問掲示板” へ戻る