2014-09-19 64 views
0
struct Message1 { 
    int a; 
    int b; 
}; 
template<class MSG_T> void RegisterMessageType() { 
    MSG_T t; 
} 

Message1 m; 
RegisterMessageType<Message1>(); 

错误消息:如何调用此函数模板?

error C2909: 'RegisterMessageType': explicit instantiation of function template 
      requires return type 

error C4430: missing type specifier - int assumed. 
       Note: C++ does not support default-int 

error C2768: 'RegisterMessageType' : illegal use of explicit template arguments 

有什么不对?谢谢。

对不起,再次编辑。

,如果我把

Message1 m; 
RegisterMessageType<Message1>(); 

成主要功能,它(VS2010)可以对其进行编译好了。但是如果我把它放在main之外,就会发生上面的编译错误。

+0

@Borgleader:这是因为你将函数调用转换为函数。 – 2014-09-19 15:40:43

+1

我不明白的是你为什么要这样称呼它。它不需要任何参数,不会返回任何东西,它的主体只是创建(然后立即销毁)一个本地对象。如果你的例子不那么简单,而且实际上做了什么,你就会知道如何调用它。 – 2014-09-19 15:55:13

+0

这是我愚蠢的错误。 C++不允许调用主函数以外的函数。在这种情况下,编译器将该表达式假定为专门的函数模板。这使我困惑。 – user792883 2014-09-19 15:56:41

回答

4

在C++中,表达式(例如调用函数)只能在函数内部(或变量的初始值内部)发生。只是在功能外面打电话是一个错误。