他のプロジェクト全体でコードを繰り返す必要がないように、またまだ試したことのない機能、アルゴリズム、テストのために、いくつかのDLLユーティリティプロジェクトを開発してきました。それらのプロジェクトの1つは、私がまだ学んでいる言語であるC ++ / CLIであるため、この質問はばかげているように聞こえるかもしれません。ライブラリプロジェクトはC++/ CLI、F#、C#であるため、C#コンソールアプリケーションを使用してテストします。C ++ / CLIプロジェクトでは機能していなかったため、C ++/CLIコンソールテストプロジェクトを作成しました。それは機能しませんでした、そして私が元のDLL C ++の名前を変更したとき、参照は更新されませんでした。私が(最終的に)問題を発見したとき、私は.vcxprojファイルを変更し、1つのメソッドについてはusingディレクティブを可能にしましたApont<typename T>
が、ある種の内部ポインターであるテンプレートクラスについてはそうではありませんでしたが、.NETタイプとは異なりますSystem::IntPtr
T*
、の代わりにタイプの値を使用しますvoid*
。
また、(このサイトの投稿から)プロジェクト内で使用したいものを外部で使用する必要があることもわかりました。そうしないと、メタデータでそれらを出力する必要があります。だから私はその目的のために静的ユーティリティに役に立たない静的メソッドを持っています:
static void Funcionalidades()
{
int i = 10;
Apont<int> a2 = Apont<int>(i); // stack
Apont<int> ^a3 = gcnew Apont<int>(i); // heap CLR
}
それにもかかわらず、それは機能しません。C ++/CLIテストプロジェクトでの私の主な方法は次のとおりです。
int main(array<System::String ^> ^args)
{
int y(10);
Apont<int> a = Apont<int>(y);
Console::ReadKey();
return 0;
}
以下にエラーを示します(インテリセンスエラーでコンパイルできることはわかっていますが、とにかく表示します)。
error C2065: 'Apont' : undeclared identifier
error C2062: type 'int' unexpected
IntelliSense: identifier "Apont" is undefined
IntelliSense: type name is not allowed
IntelliSense: expected an expression
なぜこれらのエラーがここにあるのですか?どうすれば修正できますか?
回答や返信をいただければ幸いです。
編集(説明):
- これらのエラー
Funcionalidades
は、DLLプロジェクト内のメソッドでは発生しませんが、テストプロジェクト内のDLLの外部にあるメインメソッドでは発生しません。 - 私はすべてをヘッダーファイルに書き込んでいます。つまり、すべてのヘッダーファイルにそれぞれの.cppファイルがあるわけではありませんが、すべてのヘッダーは少なくとも1つの.cppファイルに含まれています。
- 詳細
Apont
:Apont
はテンプレートです(T *が内部で使用され、「ジェネリック型パラメーターの間接化は許可されていないため」)。Apont
コピーコンストラクターがあるので、動作するApont<int> a = Apont<int>(someInt)
はずです。Apont<int> a(someInt)
動作しません。Apont
ある種の内部ポインタです。また、関連性がないため、コード全体を投稿しませんでした。変数の名前を翻訳する必要があり、エラーが発生する可能性がありますが、簡単に修正できますが、気が散るだけです。
NTH EDIT(ここで、「n」は私が知らない番号です):
Apont
あなたが長い間不平を言ってきたのコード:
template<typename T> public ref class Apont sealed : public IDisposable
{
bool eliminado;
T *pointer;
/*void Dispose(bool tudo)
{
if (!eliminado)
{
if (tudo)
{
~Apont();
}
else
{
!Apont();
}
}
}*/
!Apont() // finalizador: limpa os recursos "unmanaged"
{
delete pointer;
pointer = nullptr;
eliminado = true;
}
public:
Apont(T &valor)
{
pointer = &valor;
eliminado = false;
ErroSeNulo = false;
ErroSeEliminado = true;
}
Apont(T &valor, bool erroSeEliminado, bool erroSeNulo)
{
pointer = &valor;
eliminado = false;
ErroSeEliminado = erroSeEliminado;
ErroSeNulo = erroSeNulo;
}
Apont(Apont<T> %outroApont)
{
this->pointer = &outroApont
}
property bool ErroSeEliminado;
property bool ErroSeNulo;
property T Valor
{
T get()
{
if (pointer != nullptr)
return *pointer;
else if (eliminado && ErroSeEliminado)
throw gcnew ObjectDisposedException("O objeto já foi pelo menos parcialmente eliminadao.");
else if (ErroSeNulo)
throw gcnew NullReferenceException();
else
return 0;
}
}
/*
Apont operator ~(/*T valor* /)
{
// este operador tem de ser declarado fora desta classe
}*/
T operator !(/*Apont apont*/)
{
return Valor;
}
void operator =(Apont<T> outroApont)
{
pointer = outroApont;
ErroSeEliminado = outroApont.ErroSeEliminado;
ErroSeNulo = outroApont.ErroSeNulo;
}
template<typename U> void operator =(Apont<U> outroApont)
{
pointer = safe_cast<T>(outroApont.pointer);
ErroSeEliminado = safe_cast<T>(outroApont.ErroSeEliminado);
ErroSeNulo = safe_cast<T>(outroApont.ErroSeNulo);
}
/*
void operator =(T *&outroPointer)
{
pointer = outroPointer;
}
template<typename U> void operator =(U *&outroPointer)
{
pointer = safe_cast<T>(outroPointer);
}*/
void operator =(T *outroPointer)
{
pointer = outroPointer;
}
template<typename U> void operator =(U *outroPointer)
{
pointer = safe_cast<T>(outroPointer);
}
~Apont() // destruidor: limpa todos os recursos
{
this->!Apont();
}
// Error C2605: 'Dispose': this method is reserved within a managed class
// O código será gerado automaticamente a partir do finalizador e do destrutor
};
template<typename T> Apont<T> operator ~(T &valor)
{
return gcnew Apont<T>(valor);
}