为什么我的类成员函数的部分模板特化会得到编译错误?

时间:2014-05-20 03:54:58

标签: c++ templates

对于以下代码,我收到了一些编译错误,并且不知道原因。

~/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>的定义,但这是错过的。

1 个答案:

答案 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类型的三个参数的类。