在线等关于template的问题,请各位不吝赐教

时间:2022-09-16 16:53:36
如下代码:
#include <iostream>
template<typename T> class A
{
public:
A():point_ptr(creat_point){}
~A(){delete point_ptr;}
private:
template<typename Type> struct Point;
Point<T> *point_ptr;
Point<T> * creat_point();
};
template<typename T>  template<typename Type> struct A<T>::Point 
{
Type x,y;
};
template<typename T>  typename A<T>::template Point<T> *A<T>::creat_point()
{
return new Point<T>();
}
int main()
{
    return 0;
}

在gcc中编译通过,在vs2010下编译提示:unable to match function definition to an existing declaration
请各位不理赐教,多多指教

9 个解决方案

#1


这个错误意识是: struct Point怎么办的?无法找到定义啊

#2


引用 1 楼  的回复:
这个错误意识是: struct Point怎么办的?无法找到定义啊

我明白那个错误的意思是说,定义和声明不匹配。但是这个在gcc下是可以编译成功的

#3


各家编译器肯定有自己的特点,不要强求,就好像那些一连串++i和i++的运算结果一样的,编译器不同,结果就可能不同,标准又没有规定你这个必须像GCC那样编译。

#4


引用 3 楼  的回复:
各家编译器肯定有自己的特点,不要强求,就好像那些一连串++i和i++的运算结果一样的,编译器不同,结果就可能不同,标准又没有规定你这个必须像GCC那样编译。

谢谢你的回复,不过我觉得这个是不是编译器的问题,vs的错误信息如下

e:\mydocument\project\visualsdudio\test\test_c++\main.cpp(20): error C2244: 'A<T>::creat_point' : unable to match function definition to an existing declaration
1>          e:\mydocument\project\visualsdudio\test\test_c++\main.cpp(10) : see declaration of 'A<T>::creat_point'
1>          definition
1>          'A<T>::Point<T> *A<T>::creat_point(void)'
1>          existing declarations
1>          'A<T>::Point<T> *A<T>::creat_point(void)'

他也指出了这个函数的定义和声明,都是一样的,却还报错。

#5


我也知道过于纠结于此,也不好,但我想知道是不是我写的代码不符合标准才导致了这个问题

#6


自己再顶一下

#7


template<typename T> 
class A
{
public:
A():point_ptr(creat_point()){}
~A(){delete point_ptr;}
private:
template<typename Type> 
struct Point
{
Type x, y;
};
Point<T>* point_ptr;
Point<T>* creat_point()
{
return new Point<T>();
}
};

vs2005

#8


给这模版语法跪了,估计是VC的bug
另外模版函数真没分开写的意义

#9


引用 8 楼  的回复:
给这模版语法跪了,估计是VC的bug
另外模版函数真没分开写的意义

试过各家编译器,g++ clang++ icl都是编译过的

#1


这个错误意识是: struct Point怎么办的?无法找到定义啊

#2


引用 1 楼  的回复:
这个错误意识是: struct Point怎么办的?无法找到定义啊

我明白那个错误的意思是说,定义和声明不匹配。但是这个在gcc下是可以编译成功的

#3


各家编译器肯定有自己的特点,不要强求,就好像那些一连串++i和i++的运算结果一样的,编译器不同,结果就可能不同,标准又没有规定你这个必须像GCC那样编译。

#4


引用 3 楼  的回复:
各家编译器肯定有自己的特点,不要强求,就好像那些一连串++i和i++的运算结果一样的,编译器不同,结果就可能不同,标准又没有规定你这个必须像GCC那样编译。

谢谢你的回复,不过我觉得这个是不是编译器的问题,vs的错误信息如下

e:\mydocument\project\visualsdudio\test\test_c++\main.cpp(20): error C2244: 'A<T>::creat_point' : unable to match function definition to an existing declaration
1>          e:\mydocument\project\visualsdudio\test\test_c++\main.cpp(10) : see declaration of 'A<T>::creat_point'
1>          definition
1>          'A<T>::Point<T> *A<T>::creat_point(void)'
1>          existing declarations
1>          'A<T>::Point<T> *A<T>::creat_point(void)'

他也指出了这个函数的定义和声明,都是一样的,却还报错。

#5


我也知道过于纠结于此,也不好,但我想知道是不是我写的代码不符合标准才导致了这个问题

#6


自己再顶一下

#7


template<typename T> 
class A
{
public:
A():point_ptr(creat_point()){}
~A(){delete point_ptr;}
private:
template<typename Type> 
struct Point
{
Type x, y;
};
Point<T>* point_ptr;
Point<T>* creat_point()
{
return new Point<T>();
}
};

vs2005

#8


给这模版语法跪了,估计是VC的bug
另外模版函数真没分开写的意义

#9


引用 8 楼  的回复:
给这模版语法跪了,估计是VC的bug
另外模版函数真没分开写的意义

试过各家编译器,g++ clang++ icl都是编译过的