错误C2661:没有重载函数需要2个参数

时间:2014-08-26 09:13:56

标签: c++ visual-c++

我正在使用Visual Studio 2010进行win32应用程序开发。尝试编译一个已经在GCC(Linux)中编译的现有c ++源文件。

#define DEFINE_PORT( parentClass, portClass, name, dataMember, callbacks,... )     
   do                                                                          
   {                                                                           
      dataMember = new portClass<parentClass>( *this, callbacks );            
      err = addProvidesPort( name, dataMember );                               
   }                                                                           
   while(0)

我在这里调用此函数:

   DEFINE_PORT( Service_impl,
                         ECPDataStoreProvidesPort,
                         ECP_DATA_STORE,
                         pECPDataStorePP,
                         &Service_impl::GetDataVersion,
                         &Service_impl::SetDataVersion,
                         &Service_impl::LoadData,
                         &Service_impl::StoreData,
                         &ECPService_impl::EnableBlobOperations,
                         &ECPService_impl::GetCurrentPersonalityIndex,
                         &ECPService_impl::SwapPersonalities,
                         &ECPService_impl::UpdateDataStoreBlob,
                         &ECPService_impl::ExtractDataStoreBlob,
                         &ECPService_impl::GetConstantPersonalityPtr );

ECPDataStoreProvidesPort类的构造函数定义为10个参数。 这里VS编译器不考虑变量长度参数并产生错误,因为portclass没有为两个结果定义重载构造函数。

有人可以帮我解决这个问题吗?可能是什么原因以及如何处理此错误?

1 个答案:

答案 0 :(得分:1)

在您的扩展中,callbacks设置为&Service_impl::GetDataVersion,其余参数(...)将被忽略。

...参数应该在宏体中称为__VA_ARGS__

#define DEFINE_PORT( parentClass, portClass, name, dataMember, ... )\     
   do                                                               \          
   {                                                                \           
      dataMember = new portClass<parentClass>( *this, __VA_ARGS__ );\            
      err = addProvidesPort( name, dataMember );                    \           
   }                                                                \           
   while(0)