2017-01-19 21 views
-1

我想了解c + +的概念,因为我不是很先进的。虽然我有一个下降的知识,我绝对不知道这里发生了什么!获取错误:C3867 t'Template_class <int> :: add':非标准语法;当使用指针功能与模板

我正在制作一个程序,其中我只是有一个指向函数的指针的template_class,它返回函数add的值。我正在使用Visual c + +,并由于某种原因它返回main.cpp中的以下错误: -

错误C3867'Template_class :: add':非标准语法;使用 '&' 创建一个指向member`

的main.cpp

#include<iostream> 
#include<string> 
#include"Template_class.h" 

using namespace std; 

int main() 
{ 
    Template_class <int> t; 

    t.retrunOperation(4, 5, t.add); 
    cin.get(); 
} 

Template_class.h

#include<iostream> 

template<class T> 
class Template_class 
{ 
public: 
    Template_class() 
    { 

    } 
    ~Template_class() 
    { 

    } 

    T add(T var1 , T var2) 
    { 
     return var1 + var2; 
    } 

    void retrunOperation(T var1 , T var2 , T (*function)(T , T)) 
    { 
     std::cout << (*function)(var1, var2); 
    } 
}; 

这可能是一个无效的问题(对此,我不知道),但正如我说我不是一个高级程序员,所以请建议我一些解决方案

+0

是不是错误,告诉你究竟** **如何解决它? – SergeyA

+0

你有没有试图去做什么错误建议? –

+3

不,错误并不是说如何解决这个问题。这只会导致不同的错误。 – hvd

回答

0
void retrunOperation(T var1 , T var2 , T (*function)(T , T)) 

function参数需要一个函数指针。

(常规)函数指针不能指向非静态成员函数。 Template_class::add是一个非静态成员函数。因此它不能被一个函数指针指向。

最微不足道的解决方案是使用static关键字将Template_class::add声明为静态成员函数。静态成员函数可以由函数指针指向。


非成员函数将隐式地衰变成一个指针的功能,而无需使用AddressOf运算符(&)的名称。非静态成员函数可以由成员函数指针指向,它们不能转换为(常规)函数指针。但是,非静态成员函数的名称不会隐式衰减到成员函数指针中。这是错误信息告诉你的。如果你通过添加addressof运算符来解决这个问题,那么你会因为缺少拟合过载而被给出另一个错误。

+0

感谢user2079393 !!!那确实解决了问题!但是,你能告诉我更多关于静态函数和指针相关的东西!因为那真的会帮助我! – mitesh

+0

@mitesh这应该有所帮助:http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list – user2079303

0

编译器错误是告诉你,传递一个成员函数的正确方法是

t.retrunOperation(4, 5, &Template_class<int>::add); 

但是,当你解决这个问题,你会发现,retrunOperation()想要一个指针功能,而不是指向成员函数。然后,您需要做add静:

static T add(T var1 , T var2) 
{ 
    return var1 + var2; 
} 

或(不太可能)宣布retrunOperation()为取一个成员函数指针:

void retrunOperation(T var1 , T var2 , T (Template_class<int>::*function)(T , T)) 

,并适当地实现它。

+0

是的,我做了添加静态,它的工作!谢谢 !!我非常感谢支持。但我想更多地了解静态。你能告诉我吗? – mitesh

+0

指向成员的指针不同于指向成员函数的指针:) – user2079303

+1

@mitesh *任何* [在C++上的正派书籍](https://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and- list?s = 1 | 32.8400)详细说明了成员和静态成员(包括数据和函数)之间的区别。如果你至少没有一个,你应该纠正这个问题。 – WhozCraig

0

非静态成员函数签名:

Ret Class::name(Type, Type2...); 

指向一个成员函数,那么看起来像:

Ret Class::* name(Type, Type...); 

所以,当你说:

t.retrunOperation(4, 5, t.add); 

你正试图给

int(*function)(int, int) 

其中

int(Template_class<int>::*function)(int , int) 

预期。

采用以上,解决您的具体问题看起来像这样:

template<class T> 
class Template_class 
{ 
public: 
    T add(T var1 , T var2) { return var1 + var2; } 

    void retrunOperation(T var1 , T var2 , T(Template_class<T>::*function)(T , T)) {} 
}; 

,你可以这样调用:

t.retrunOperation(4, 5, &Template_class<int>::add); 
相关问题