【发布时间】:2013-08-13 08:01:03
【问题描述】:
当我显式实例化模板时,如何将 pimpl 用于模板化类?
我只需要一个示例代码。
我试过的是:
// MyTemplatedClass.h
template< class T >
class MyTemplatedClass
{
private:
class Impl;
Impl* _pimpl;
public:
void PublicMethod();
}
我的实现如下:
// MyTemplatedClass.cpp
template< class T >
class MyTemplatedClass<T>::Impl
{
public:
void PublicMethod();
}
template <class T>
void MyTemplatedClass<T>::Impl::PublicMethod()
{
...
}
将方法调用转发到实现类:
template< class T >
void MyTemplatedClass<T>::PublicMethod()
{
_pimpl->PublicMethod();
}
显式实例化: 带 int 和 double 的示例:
template class MyTemplatedClass< int >;
template class MyTemplatedClass< double >;
但它似乎不起作用。
【问题讨论】:
-
当某件事“[似乎]不起作用”时,总是准确地告诉我们如何它“[似乎]不起作用” 。”换句话说,您遇到了什么错误?
-
当我尝试转发 PublicMethod 时,编译器没有检测到我的 PublicMethod。 _pimpl-> 应该给我一个可用方法的列表,但没有一个存在。
-
你说的是你的IDE,对吧? IDE 和编译器中的代码分析通常是两件不同的事情;如果您的 IDE 只是没有向您显示某个方法可用,那并不一定意味着如果您在那里使用它,编译器就不会找到它。
-
它给了我错误:C2227:'->PublicMethod' 的左边必须指向类/结构/联合/通用类型 1> MyTemplatedClass.cpp(65):编译类模板成员函数时void MyTemplatedClass
::PublicMethod()' -
@user1507569 似乎编译器找不到
_pimpl的正确定义。尝试在其前面加上this->。
标签: c++ templates explicit pimpl-idiom