0

問題はほとんどすべてですが、テンプレートクラスで不透明な 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 の定義を含めないと公開できないため、これは機能しません。そのため、関数が見つからないというエラーが発生します。

4

1 に答える 1

1

それらが非互換であるべき理由はありません。コンパイラが知る必要があるのは、ポインタがあること*だけであり、型の隣にある小さな文字がまさにそれを示しています。ただし、コード スニペットには多くのエラーがあります。これをコンパイルしてみてください:

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が未使用であることです.

于 2013-03-20T17:28:42.210 に答える