对于以下代码,我收到了一些编译错误,并且不知道原因。
~/sandbox/test-cxx $ g++ test-template-specialization.cpp
test-template-specialization.cpp:23:12: error: invalid use of incomplete type ‘class Search_A_Scale<A, 0, C>’
operator()()
^
test-template-specialization.cpp:8:7: error: declaration of ‘class Search_A_Scale<A, 0, C>’
class Search_A_Scale
^
代码:
/* test-template-specialization.cpp */
#include <iostream>
#include <string>
using namespace std;
template <int A,
int B,
int C>
class Search_A_Scale
{
public:
bool operator()();
enum {
kb = B,
kc = C
};
};
#if 1 // this block cimpiled failed.
template <int A,
int C>
bool Search_A_Scale<A, 0, C>::
operator()()
{
return true;
}
#else // this block compiled successfully.
template <int A, int C>
class Search_A_Scale<A, 0, C>
{
public:
bool operator() () { return true; }
};
#endif
int main()
{
Search_A_Scale<1, 0, 24> a;
cout << a() << endl;
return 0;
}
更新:我自己的回答
根据标准14.5.5.3
类模板特化是一个独特的模板。的成员 类模板部分特化与成员无关 主要模板。
也就是说,主要类模板Search_A_Scale<A, B, C>
与类模板部分特化Search_A_Scale<A, 0, C>
不同,因此指定成员Search_A_Scale<A, 0, C>::operator()
需要Search_A_Scale<A, 0, C>
的定义,但这是错过的。
答案 0 :(得分:0)
#if中的函数看起来像
的成员函数template <int A, int B, int C>
class Search_A_Scale
您应该在&#34;#if&#34;中更改声明。 as:
#if 1 // this block changed,which was failing earlier
template <int A, int B, int C>
bool Search_A_Scale<A, B, C>::operator()()
{
return true;
}
当我们使用Search_A_Scale时,作为范围解析编译器应该找到
template <int A, int B, int C>
class Search_A_Scale
作为候选者,但函数中的模板规范是
template <int A,int C>
bool Search_A_Scale<A, 0, C>::operator()()
并且没有定义哪个类占用2个参数,它存在于#if条件的其他部分时: 模板 class Search_A_Scale
因此,当我们执行else部分时,我们得到一个专门用于获取A,0和C类型的三个参数的类。