Generics c++-cli:当一个泛型函数调用另一个泛型函数时,为什么调用它会失败?

Generics c++-cli:当一个泛型函数调用另一个泛型函数时,为什么调用它会失败?,generics,c++-cli,Generics,C++ Cli,以下代码是我的程序和类的基本部分,用于重现故障: using namespace System; generic <class T> ref class gener { public: void func1g (T value) { Console::WriteLine (value); int iValue = static_cast<int>(value); if (iValue <= 0) return; func2

以下代码是我的程序和类的基本部分,用于重现故障:

using namespace System;

generic <class T>
ref class gener
{
public:
  void func1g (T value)
  {
    Console::WriteLine (value);
    int iValue = static_cast<int>(value);
    if (iValue <= 0) return;
    func2 ();
  }

  void func2 ()
  {
    T value = (T)(Object^)0;
    func1g (value);
  }
};

int main()
{
  gener<int>^ g = gcnew gener<int>;
  int iValue = 1;
  g->func1g (iValue);  // <<=== System.TypeLoadException

  return 0;
}
编辑 我找到了一种“变通方法”,请参见下面的答案,但我不知道为什么会这样。
如果有人能向我解释这次失败的原因和解决办法的作用,我将不胜感激

编辑2
如果您想复制这个:我使用VS 2008 SP1。

我希望它不再像上一期那样与编译器相关,尽管我个人认为这很可能

经过一些测试,我刚刚找到了这个特定问题的解决方案:

我需要定义
func1g
,如下所示:

generic <class T>
void func1g (T value)
{
  ...
}
现在,编译器抱怨cpp出现错误C2511:“void genr::func1g(T)”:在“genr”中找不到重载的成员函数。

因此,我继续玩弄(这真的是反复试验)并找到了一个有效的解决方案,我完全不明白了:

using namespace System;

generic <class T>
ref class gener
{
public:
  generic <class T2>
  void func1g (T2 value);

  void func2 ()
  {
    T value = (T)(Object^)0;
    func1g (value);
  }
};

generic <class T>
generic <class T2>
void gener<T>::func1g (T2 value)
{
  Console::WriteLine (value);
  int iValue = static_cast<int>(value);
  if (iValue <= 0) return;
  func2 ();
}

int main()
{
  gener<int>^ g = gcnew gener<int>;
  int iValue = 1;
  g->func1g (iValue);

  return 0;
}
使用名称空间系统;
通用的
参考类生成器
{
公众:
通用的
无效函数1g(T2值);
void func2()
{
T值=(T)(对象^)0;
func1g(值);
}
};
通用的
通用的
void genr::func1g(T2值)
{
控制台::WriteLine(值);
int iValue=静态(数值);
if(iValue func1g(iValue);
返回0;
}
有人能给我解释一下吗?
实际上我不知道双重
泛型
定义是可能的。

这是C代码(顺便说一句,它在C中也被破坏了,除非
t
System.Int32
System.Int32
,你应该使用
默认值(t)
),在C++/CLI中这是不合理的

  void func2 ()
  {
      T value = (T)(object)0;
      func1g(value);
  }
仅仅因为C++/CLI编译器接受完全相同的代码,并不意味着它做同样的事情

object
是C#中的一个关键字,我不知道您在C++/CLI中添加了哪些宏以使其可编译(通常不会),但等效的C++/CLI类型是
System::object^
(注意句柄)

无论如何,您只需要一个值初始化的项目类型<代码> t>代码>,在C++中,它被写成

T value{};

异常是否恰好发生在
g->func1g(iValue)
还是它发生在
func1g
内部的某个地方?@crashmstr:它恰好发生在这一行。函数本身没有“打开”。异常消息中是否有任何内容?可能会有帮助:@crashmstr:如果您还没有注意到:请查看编辑和我的答案。
静态\u cast(值)
绝对不等同于
Convert.ToInt32(value)
。那将是
Convert::ToInt32(value)
,我想你应该在这里使用它。C中的
static_cast(value)
的等价物将是
(int)value
,这将首先无法编译。泛型不是模板:)最初,我使用了一种不同的方式将int转换为generic。在编写c#程序时,我随后对c++cli程序进行了调整,使该部分相同。但我已经写了这篇文章的这一部分,包括代码,并从错误的c#prog复制了这一行。;我的错,编辑。我没有使用任何宏。也可以看到我的答案,它包含工作代码。int32 BTW只是为了避免无止境的循环和堆栈溢出。原程序在这一部分有所不同。3年后的c++cli,我知道了^handle;-)但是谢谢你的初始信息!
  void func2 ()
  {
      T value = (T)(object)0;
      func1g(value);
  }
T value{};