質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

3267閲覧

template関数はヘッダー、ソースファイル分けは出来ないのでしょうか?

退会済みユーザー

退会済みユーザー

総合スコア0

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2021/05/06 05:02

提示コードですがテンプレート関数を定義とヘッダーを分けたのですがエラーになりました。そもそもテンプレート関数はヘッダーとソースに定義と宣言を分けることは出来ないのでしょうか?

エラー [ 重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態
エラー LNK2019 未解決の外部シンボル "int __cdecl test2<int>(int)" (??$test2@H@@YAHH@Z) が関数 _main で参照されました test C:\Users\yw325\Desktop\test\test\Main.obj 1
]

エラー[ 重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態
エラー LNK1120 1 件の未解決の外部参照 test C:\Users\yw325\Desktop\test\Debug\test.exe 1
]

cpp

1#include <iostream> 2#include "test.hpp" 3 4 5//テンプレート関数 6template<typename t> 7t test(t a) 8{ 9 return a; 10} 11 12 13 14 15int main() 16{ 17 //int a = test<int>(3); 18 int a = test2<int>(3); 19 20 21 return 0; 22}

cpp

1#include "test.hpp" 2 3template<int> int test2(int a) 4{ 5 return a; 6}

hpp

1template<typename t> 2t test2(t a); 3 4template int test2(int a); 5 6 7

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

こんにちは。

テンプレートはテンプレート引数を与えて実際のクラス定義や関数定義に展開した(このことを「実体化」と呼びます)上でコンパイルされます。
ヘッダ・ファイルは一般に他のソース(①)からインクルードされ、そのヘッダ・ファイル内で定義されているテンプレートを使いますが、その際にテンプレート引数を与えて「実体化」した上でコンパイルします。

さてここで、テンプレート宣言のみをヘッダ・ファイルへ含め、そのテンプレートの実装を当該cppファイル(②)内で定義した場合、その②ファイルは、上記の①ファイルないで行われている「実体化」を知る方法がありません。つまり、「実体化」されないためコンパイルできないわけです。
その結果、①ファイル内で呼出した「実体化」されたテンプレートの実装が存在しないため、リンク時に未定義エラーとなります。
この問題を回避するには、②ファイル内で、実際に使われるケース全てのテンプレート引数を明示的に与えて、「明示的実体化」する方法があります。事前にテンプレート引数を全て想定する必要があるので、使い勝手が悪く、使われるケースは限定的です。

詳しくは、第3回 分割コンパイルとテンプレートの「明示的」実体化で解説していますので、もしよろしかったら参考にされて下さい。

投稿2021/05/06 05:39

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

やれなくないけど限定的。原則できません。

投稿2021/05/06 05:16

episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/05/06 05:19

一応知りたのですが教えてくれますでしょうか?
episteme

2021/05/07 00:51

export をまぢに実現するとなるとコンパイラ/リンカを二回動かすことになるハズで、 実際にやってみたコンパイラ屋さんが「くっそメンドクセーから廃止しよーよ」って 提案したんじゃなかったかなーwww
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問