【发布时间】:2012-01-10 12:59:09
【问题描述】:
上下文
我们开发了一个模板化设置系统类,它将成为我们向不同架构的用户公开的 API 的一部分(少说:我们不应该依赖编译器特定的行为)
通用代码如下所示:
在标题中
namespace Firm
{
// Class definition
class A
{
template<class T>
void foo(T* aParam);
};
// Non specialized template definition
template<class T>
void A::foo(T* aParam)
{
//...
}
// Declaration of a specialization
template<>
void A::foo<int>(int* aParam);
} // namespace
在 CPP 文件中
namespace Firm
{
// Definition of the specialized member function
template<>
void A::foo<int>(int* aParam)
{
//...
}
} // namespace
问题
gcc 4.x 一切正常。 (即不同的编译单元在适当的时候使用专门的方法。)但是我读到以下条目后感到不舒服:
Visibility of template specialization of C++ function
接受的答案状态,如果我理解正确,如果 从调用中看不到模板方法的特化定义,则这是一个错误网站。 (所有不是上面列出的CPP文件但包含头文件的编译单元都是这种情况)
我不明白为什么此时声明还不够(标题提供的声明)?
-
如果它真的是一个错误,有没有正确的方法来定义它的专业化:
- 非内联
- 可用于包含标头(以及与相应 .obj 的链接)的任何编译单元?
【问题讨论】: