考虑以下头文件和源文件:
// 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
文件中定义专业化并正确链接? - 如果不是,为什么不呢?我可以显式地实例化非专门化的模板方法。为什么完全专业化不一样?