即使不调用它,编译器也会在模板类中实例化该函数

iam*_*ind 1 c++ templates compiler-errors instantiation

我有一个错误的看法,即a中的template函数class只有在被调用时才被实例化.请参阅以下简单代码:

template<typename T>
struct A
{
  T *p; 
  T& operator * () { return *p; }
};

int main ()
{
  A<int> ai;   // ok
  int i = *ai;  // works fine
  A<void> av;  // compiler complains even "*av" is not called
}
Run Code Online (Sandbox Code Playgroud)

在声明时A<void>,编译器错误如下:

error: forming reference to void
Run Code Online (Sandbox Code Playgroud)

我试图void在模板外部专门化函数,如下所示:

template<>
void A<void>::operator * () {}
Run Code Online (Sandbox Code Playgroud)

但它没有帮助,并给出错误:

error: no member function ‘operator*’ declared in ‘A<void>’
Run Code Online (Sandbox Code Playgroud)

有没有办法用C++ 03解决这个问题?

dyp*_*dyp 5

关于什么

template < typename T >
struct ReferenceOrVoid
{ typedef T& Value; };

template < >
struct ReferenceOrVoid < void >
{ typedef void Value; };

template<typename T>
struct A
{
    T *p; 
    typename ReferenceOrVoid < T > :: Value
    operator * () { return *p; }
};
Run Code Online (Sandbox Code Playgroud)

当然,这取决于你想要什么A表现的情况下,Tvoid.当然,您也可以专门化整个A结构void.