模板和不透明指针是否在继承上不兼容
Are templates and opaque pointers inheritenly incompatible?
几乎都在问题中,但是是否有任何方法可以从使用模板类的不透明ptr中获得封装?(我的直觉是"不",因为编译器必须在编译时意识到一切)
类似这样,MyClass应该通过静态库公开,而MyClassImp是隐藏的。
//MyClass.h
template <typename T> MyClassImp;
template <typename T> MyClass
{
public:
MyClass();
void Foo();
private:
MyClassImp<T>* impl;
}
//MyClassImp.h
template <typename T> MyClassImp
{
public:
MyClassImp() {}
void Foo() {/*proprietary/complex stuff I want to hide*/}
}
//MyClass.cpp
template <typename T>
MyClass::MyClass()
{
impl = new MyClassImp();
}
template <typename T>
void MyClass::Foo() { impl->Foo(); }
这不起作用,因为隐藏在.cpp文件中的MyClass::Foo如果不包含MyClassImp的定义就不能公开,所以您会得到一个函数缺失错误。
它们没有理由不兼容。编译器只需要知道有一个指针,类型旁边的小*
告诉我们这个。你的代码片段有很多错误。试着编译这个:
template <typename T> class MyClassImp;
template <typename T> class MyClass
{
private:
MyClassImp<T>* impl;
};
int main()
{
MyClass<int> a;
return 0;
}
定义模板时注意class
关键字,定义模板后注意;
关键字。如果你试过,你就知道了。您可以使用以下命令编译上面的代码:
g++ -std=c++98 -pedantic -Wall -Wextra a.cpp
,您得到的唯一警告是a
未使用。
相关文章:
- 我收到同义重复编译器错误。我应该如何修复"类型"X"的参数与类型"X"的参数不兼容?
- 字符类型转换不兼容
- Qt:如何使不兼容的发送方/接收方参数兼容?
- 视觉工作室 2017;启用 /permissive 时,类型 "const wchar_t *" 的参数与类型 "PWSTR" 的参数不兼容
- 使用不兼容的分配器复制分配无序列图
- 类型为 "int*" 的参数与 C++ 中错误类型"int**"参数不兼容
- 该对象具有与成员函数不兼容的类型限定符.为什么会出现此错误?
- 我正在尝试将表的地址传递给要在另一个函数中使用的指针,但得到不兼容的指针类型
- 为什么范围算法与 std 的迭代器不兼容?
- Winpcap Findalldevs const char * 与 char * 不兼容
- C++ 类型的参数与 void (__cdecl*)(void) 类型的参数不兼容,当调用 std::atexit()
- 将"std::string {aka std::basic_string}"赋值中的不兼容类型<char>
- 如何在C++中停止调用不兼容的方法?
- OPENCL 警告:不兼容的指针类型将'float __global[16]'传递给类型为 '__global float4 的参数 *
- 函数范围的静态变量如何导致与共享库中函数代码的未来使用不兼容
- 如何修复"方法的类型与 PInvoke 不兼容"
- C++不兼容的迭代器类型
- 编译器错误"在if语句中分配不兼容的类型"
- 从 std::streambif 继承时不兼容析构函数编译器警告
- 模板和不透明指针是否在继承上不兼容