..在没有模板参数错误的情况下使用
... used without template parameters error
我再次需要你的帮助...
我有以下代码,这导致非命名空间范围错误的显式专用化:
namespace __test
{
template <int A, int B, typename C> class Test
{
template <int V> void check(C & a) { }
template <> void check<0>(C & a) { } //error: explicit specialization in non-namespace scope 'class __test::Test<A, B, C>'
};
}
由于我已经知道如何修复此类错误,因此我在类范围之外定义了专用化,但是我遇到了另一个错误 - ...不带模板参数使用:
namespace __test
{
template <> void Test::check<0>(C & a) { } //error: 'template<int A, int B, class C> class __test::Test' used without template parameters
}
我可能只是愚蠢,但我不明白这个问题的原因,我不知道如何解决它......请帮忙!
根据我对标准的解读,你想做的事情似乎是合法的。引用 §14.7.3/18:
在类模板的成员或出现在命名空间作用域中的成员模板的显式专用化声明中,成员模板及其某些封闭类模板可能保持非专用化状态,但如果类成员模板的封闭类模板也未显式专用化,则声明不得显式专用化类成员模板。在这种明确的专用化声明中,应提供关键字
template
后跟模板-参数-列表,而不是成员显式专用化声明之前的template<>
。模板参数列表中的模板参数类型应与主模板定义中指定的类型相同。
由于您显式专用于成员函数模板而不是类成员模板,因此应该没问题;但是,Comeau、GCC 和 VC++ 都不允许以下内容,这应该是正确的语法:
namespace test
{
template<int A, int B, typename C>
class Test
{
template<int V>
void check(C& a) { }
};
template<int A, int B, typename C>
template<>
void Test<A, B, C>::check<0>(C& a) { }
}
- Comeau 说
error: a template declaration containing a template parameter list may not be followed by an explicit specialization declaration
,如果我们将 §14.7.3/18 中的规则也应用于成员函数模板,这是有意义的 - 海湾合作委员会说
invalid explicit specialization before '>' token
;enclosing class templates are not explicitly specialized
,如果我们将 §14.7.3/18 中的规则也应用于成员函数模板,这又是有意义的 - VC++说
error C2768: 'test::Test<A,B,C>::check' : illegal use of explicit template arguments
,这不是一个有用的错误消息,但通常与其他错误消息一致
我的猜测是,当封闭类模板没有明确专用时,必须提交一份缺陷报告,该报告也不允许成员函数模板的显式专用化; 但是,我不能明确地说,因为§14.7.3/18的措辞在C++03标准和C++0x FDIS之间没有变化(如果针对C++03提交DR并被接受,则会改变)。
你需要完全专业化所有内容,就像这样:
namespace __test {
template <int A, int B, typename C>
class Test
{
template <int V> void check(C & a) { }
};
template <>
template <>
void Test<1, 2, int>::check<0> (int &)
{
}
}
或者使用帮助程序结构来避免尝试部分专用化模板类的模板方法(GCC 和许多其他人不会理解):
namespace __test {
template <typename C, int V>
struct TestHelper
{
static void check (C & a)
{
}
};
template <typename C>
struct TestHelper<C, 0>
{
static void check (C & a)
{
}
};
template <int A, int B, typename C>
class Test
{
template <int V> void check(C & a)
{
TestHelper<C, V>::check (a);
}
};
}
相关文章:
- 特定情况下的分段错误
- MSVC 在不知道类型的情况下评估上下文(和错误)
- 如何在没有打印语句的情况下报告用户输入错误
- 在最坏的情况下试验快速排序.它运行良好,但在最坏的情况下发生未知错误.我想
- 如何在不设置 ulimit -n 的情况下解决套接字程序打开太多文件的错误
- 调整向量大小并检索值,这是否正确或在任何情况下都可能导致段错误?
- 如果 return 语句在带括号的循环中,错误可能会到达非 void 函数的末尾,但不会显示在没有括号的循环的情况下
- 我需要在不使用前向声明的情况下相互包含两个头文件,导致"incomplete type"错误
- 在存在错误代码的情况下输出参数与 NRVO
- 对象无法访问其私人数据.错误:在这种情况下私有
- 在这种情况下如何解决?语法错误:在"* "node" ?
- 如何编写一个通用函数,该通用函数在没有任何条件和条件的情况下工作(无论是真实和错误)
- 错误:在 DLSYSM 的情况下,从“void*”到“void (*)()”的转换无效
- 我的调试器说我有一个隔离错误错误,但无法告诉我在哪里,在非常特殊的情况下发生
- 为什么在这种情况下编制动态库错误
- 即使我传递了无效的类型参数,我为什么还能在没有错误的情况下编译此代码
- 呼叫send()关闭申请的情况下没有错误
- 如何在没有错误的情况下展示特殊的中文,韩语,日本角色
- C 如何在没有错误的情况下调用void函数
- 在不包括任何内容的情况下获得错误声音