请查看以下代码段(伪代码,未编译):
A.h
template <typename T>
void SubTest(T t) = delete;
template <>
void SubTest(int i)
{
cout << i;
}
template <typename T>
class MyClass
{
public:
void Test(T t)
{
SubTest(t);
}
}
B.h
class X{};
template <>
void SubTest(X x)
{
cout << x;
}
如您所见,我希望类模板方法调用函数模板。该功能以各种方式专门化。有些专业位于A.h中,另一些则位于可选标头中(例如B.h)。 我想避免A.h依赖于B.h等,因为A.h可以独立工作,但可以通过提供专业化功能的许多其他模块进行扩展。从逻辑上讲,这种依赖性不是必需的,但从技术上讲似乎是无法避免的。
AFAIK C ++需要两个条件:
我可以在B.h中加入A.h。或者我可以在B.h中重复template <typename T> void SubTest(T t) = delete;
来满足条件2。但是,这仍然不能满足条件1。
我可以将B.h包含在A.h的中间,但这会造成(逻辑上)不必要的依赖关系。
有没有办法在C ++到C ++ 20的编译时解决此问题?
答案 0 :(得分:3)
虽然确实是“必须在使用之前声明专业化”,但这并不意味着在对其调用者进行定义之前,而是在对其进行实例化之前,因此关于使用所涉及的专业化。这对于任何定制方案都是至关重要的:首先定义基本情况,然后定义客户端#include
,并在定义后立即为其类定义特殊化。如果其他客户拥有可用的类,则他们必然具有可用的专业知识,因此一切正常。自 C ++ 98 以来,所有这些都没有改变。
(同时,您不能为函数重复=delete
:该函数视为定义,并且也必须出现在第一个声明中。)