テンプレートの宣言と定義を分離する中規模または大規模な複雑なプロジェクトでは、コンパイル時間を短縮するのに便利です 分離されたヘッダ/ソースのためのC++でのテンプレート特化の堅牢な方法
しかし、複雑なコードでは、小さなプログラマーの間違いが気付かれない振る舞いの変化につながる可能性があります。 特殊化の代わりに汎用バージョンが呼び出されます。
例: 宣言が欠落してテンプレートの特殊化が見えなくなりました。
///////////////////// file A.hpp /////////////////////
#include <iostream>
template <typename T>
class A
{
public:
void foo()
{
std::cerr << " calling generic foo " << std::endl ;
}
};
// forgetting following declaration leads to an unintended program behaviour
template <> void A<int>::foo();
///////////////////// file A-foo-int.cpp /////////////////////
#include "A.hpp"
template <>
void A<int>::foo()
{
std::cerr << "calling <int> version of foo" << std::endl;
}
///////////////////// file main.cpp /////////////////////
#include "A.hpp"
int main(int argc , char** argv)
{
A<int>* a = new A<int>();
a->foo();
return 0;
}
///////////////////// Makefile /////////////////////
CC = g++
CPPFLAGS += -Wall -O3
CXXFLAGS += --std=gnu++0x
all: nonrobust-template-setup
nonrobust-template-setup: main.o A-foo-int.o
$(CC) $(CPPFLAGS) main.o A-foo-int.o -o nonrobust-template-setup
clean:
rm -rf *.o nonrobust-template-setup
//////////////////////////////////////////
質問: は(compiler-とプラットフォームに依存しない)可能性がより堅牢なセットアップで とあれば、どのようにそれは次のようになりますか?
もしそうでない場合は、目的の関数バージョンが呼び出されたことをテストする良い方法はありますか?
私はあなたがすべきことをすべてやっていると思います。それはちょうどそれがC++で動作する方法です: – cubuspl42