gpt4 book ai didi

c++ - 编译器在模板类中实例化函数,甚至不调用它

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:19:29 24 4
gpt4 key购买 nike

我错误地认为templateclass 中发挥作用仅在调用时实例化。请看下面的简单代码:

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
}

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

error: forming reference to void

我试图专门针对 void 的功能在模板之外如下:

template<>
void A<void>::operator * () {}

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

error: no member function ‘operator*’ declared in ‘A<void>’

有什么方法可以用 C++03 解决这个问题吗?

最佳答案

怎么样

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; }
};

当然,这取决于您希望 ATvoid 时的行为。当然,您也可以将整个 A 结构专门化为 void

关于c++ - 编译器在模板类中实例化函数,甚至不调用它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12762432/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com