Introduction

こういうコードを MSVC (Microsoft C++ コンパイラ) でコンパイルする。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <exception>
#include <iostream>

template<class char_type>
int run_loop(int argc, const char_type* argv[])
{
try
{
}
catch (const std::exception& ex)
{
}

return 0;
}

int main(int argc, const char* argv[])
{
return run_loop(argc, argv);
}

すると、

日本語
1
2
3
4
5
6
D:\demo\main.cpp(9,34): warning C4101: 'ex': ローカル変数は 1 度も使われていません。 [D:\demo\build\win\Demo.vcxproj]
D:\demo\main.cpp(18,12): message : コンパイル対象の関数 テンプレート インスタンス化 'int run_loop<char>(int,const char_type *[])' のリファレンスを確認してください [D:\demo\build\win\Demo.vcxproj]
with
[
char_type=char
]
英語
1
2
3
4
5
6
D:\demo\main.cpp(9,34): warning C4101: 'ex': unreferenced local variable [D:\demo\build\win\Demo.vcxproj]
D:\demo\main.cpp(18,12): message : see reference to function template instantiation 'int run_loop(int,const char_type *[])'
with
[
char_type=char
]

のような鬱陶しいメッセージ コンパイル対象の関数 テンプレート インスタンス化 がでる。

MSVC で開発しているとよく見るメッセージだが、関数テンプレートに問題があるようにも思えるが、実行時に特に問題も起きなかったので、理解をおざなりにしていた。
それだと良くないので理解してみようと思う。

What is this?

結論を言えば、このメッセージそのものには何の問題もない。
このメッセージはエラーやワーニングの対象行が関数テンプレートを使っている場合に、関数テンプレートの場所を教えてくれているだけなのである。

なので、今回のケースにおいては C4101 を解決または抑制すればメッセージも出なくなる。

そうは言っても、サードパーティのライブラリを使っていたりすると、そちら側でワーニングが出ているとどうにもならない…