我还发现(从这个网站的帖子中)我必须在项目中使用我想要在外面使用的东西,否则那些东西想要在元数据中发出.所以我在静态实用程序中有一个无用的静态方法用于此目的:
static void Funcionalidades() { int i = 10; Apont<int> a2 = Apont<int>(i); // stack Apont<int> ^a3 = gcnew Apont<int>(i); // heap CLR }
尽管如此,它不起作用.这是我在C/C++LI测试项目中的主要方法:
int main(array<System::String ^> ^args) { int y(10); Apont<int> a = Apont<int>(y); Console::ReadKey(); return 0; }
以下是错误(我知道它可以用intellisense错误编译,但无论如何我都会显示它们):
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文件,尽管所有头文件都包含在至少一个.cpp文件中.
>关于Apont的更多信息:
> Apont是一个模板(因为T *在内部使用,并且“不允许在通用类型的参数上进行间接”).
> Apont有一个拷贝构造函数,所以Apont< int> a = Apont< int>(someInt)应该有效;
> Apont< int> a(someInt)不起作用;
> Apont是某种内部指针;而且我没有发布整个代码,因为它不相关,我必须翻译varibles的名字,它可能有我可以轻易修复的错误,但这只会分散你的注意力.
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); }
解决方法
这是怎么回事?
如果你在Funcionalidades中包含Apont标题然后在Apont中包含Funcionalidades标题而不是你遇到麻烦.发生这种情况是因为Funcionalidades标题缺少Apont的声明,以防你在包括Funcionalidades之前在你的主要包括Apont.
然后你第一次包括Apont,它将启用头部防守.然后它将包括Funcionalidades,其中包括Apont.因为标头防护已经启用,Funcionalidades标头将不会有Apont声明.与此同时Apont声明甚至还没有在Apont的相应头文件中开始.而你在这里,因为这个问题在main中无法编译,因为在库编译时你没有这样的依赖.
我如何解决它?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。