test.htemplate<class T> T Foo() { return 0; }struct TestStruct
{
template<> friend TestStruct Foo<TestStruct>() { return TestStruct(); }
};template<class T> struct Test{
T Value;
Test(): Value(Foo<T>()){} 
};
以上代码编译会出错C3637,该如何解决?
求教。

解决方案 »

  1.   

    把.h和cpp文件放在一起,模板不支持分离 编译.
      

  2.   

    template<> friend TestStruct Foo<TestStruct>() { return TestStruct(); }看不懂这一句是想看什么。改成下面试试:frient TestStruct Foo(){};
      

  3.   

    能编译得过去呀,没有任何错误,你用VC6吧?VC6过不去很正常
    void ttt()
    {
    Test<TestStruct>();
    Foo<TestStruct>();
    }
      

  4.   

    新建一个简单的Win32控制台项目,添加以上的template.h
    compile
    出错:
    错误 3 error C2912: 显式专用化;“TestStruct Foo(void)”不是函数模板的专用化 d:\document\projects\test\win32simple\template.h 7 1 Win32Simple错误 2 error C3637: “Foo”: 友元函数定义不能是函数 模板 的专用化 d:\document\projects\test\win32simple\template.h 7 1 Win32Simple错误 1 error C2785: “T Foo(void)”和“TestStruct Foo(void)”具有不同的返回类型 d:\document\projects\test\win32simple\template.h 7 1 Win32Simple这段例子是一个大项目的一部分,定义模板的目的是以模板中定义的Foo初始化Test模板中的Value
    按说不该出问题的。求解决。
      

  5.   


    很久没做C++了,话说实际上我现在都不知道这里为什么要声明friend了。
    模板专用化后必须至少是friend才可访问吗?如果修改模板函数如何修改呢?我在网上找到过一个人提同样的问题,有人回答如下:class TestStruct
    {
      template <class TestStruct> friend TestStruct Foo(TestStruct ()) { 
         return TestStruct (); 
      }
    };
    LZ跟帖说问题解决,但在我这依然不行
    错误 1 error C2440: “return”: 无法从“int”转换为“TestStruct” d:\document\projects\test\win32simple\template.h 3 1 Win32Simple如何在不做设计上的更改的前提下实现类似的功能呢。
      

  6.   


    struct TestStruct
    {
    };
    template<> inline TestStruct Foo<TestStruct>() { return TestStruct(); }  这样算是没有错误编译通过了。
    但不知设计上与原有差别有多少。
    貌似用VS2003、2005编译原代码都可以,2008、2010就不行了。