【发布时间】:2012-10-06 18:09:05
【问题描述】:
我错误地认为class 中的template 函数只有在被调用时才会被实例化。看下面的简单代码:
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 解决这个问题?
【问题讨论】:
-
是的,您正在调用模板。另外,你调用它的方式,你甚至创建了一个变量,所以有对构造函数和析构函数的调用,这比仅仅提到类型更“调用”。
-
抱歉,你想做什么?
-
@Christian:类模板的成员函数除非使用,否则不会实例化。
-
@KirilKirov,由于实际代码很复杂,因此无法解释。所以我只是演示了一个工作示例。简而言之,我可以说我创建了一个智能指针
A,它应该可以从任何类型转换为A<void>,并且有后续要求。
标签: c++ templates compiler-errors instantiation