次のヘッダーとソース ファイルを検討してください。
// main.cpp
#include "myClass.h"
int main()
{
MyClass m;
m.foo<double>();
m.foo<float>();
}
// myClass.h
#pragma once
#include <iostream>
using namespace std;
class MyClass
{
public:
template <typename T>
void foo()
{
cout << "Template function<T> called" << endl;
}
template <>
void foo<int>()
{
cout << "Template function<int> called" << endl;
}
template <>
void foo<float>();
};
// myClass.cpp
#include "myClass.h"
template <>
void MyClass::foo<float>()
{
cout << "Template function<float> called" << endl;
}
foo<float>
特殊化に関してリンクエラーが発生します。特殊化の定義をヘッダー ファイルに配置すると、すべてが期待どおりに機能します。
その理由は、メソッドが明示的にインスタンス化されていないためである可能性があると考えました(ただし、完全な特殊template class
化では、適切なリンクのために明示的なインスタンス化は必要ありません)。メソッドを明示的にインスタンス化しようとすると、次のエラーが発生します。
エラー C3416: 'MyClass::foo': 明示的な特殊化は明示的にインスタンス化されていない可能性があります
質問は次のとおりです。
- ファイルに特殊化を定義して
cpp
適切にリンクする方法はありますか? - そうでない場合、なぜですか?特殊化されていないテンプレート メソッドを明示的にインスタンス化できます。完全なスペシャライゼーションで同じではないのはなぜですか?