2009-01-08 57 views
3

静态模板成员函数的显式实例化模板实例不停地进行故障与消息error C2785: 'at_Intermediate CUtil::convert_variant(const VARIANT &)' and '<Unknown>' have different return types与VARIANT返回类型

编译当我做非静态成员函数对应的类,编译器会喜欢我。

// utility class - static methods 
struct CUtil { 
     template< typename at_Intermediate > static at_Intermediate convert_variant(const VARIANT &v) ; 

     template<> static VARIANT convert_variant<VARIANT >(const VARIANT &v) { return v; } // 
     template<> static double convert_variant<double >(const VARIANT &v) { return v.dblVal; } 
     template<> static long convert_variant<long >(const VARIANT &v) { return v.lVal ; } 
     template<> static BSTR convert_variant<BSTR >(const VARIANT &v) { return v.bstrVal; } 
}; 

这是一个组合的问题:

  1. 为什么编译器抱怨函数“未知”,而这显然是知道的?

  2. 什么触发了这个消息 - 当函数成为全局或非静态时,它会消失。

编辑:

乔什一些有用的提示后:这是不允许的类声明中明确实例模板的功能呢?

回答

2

显然,你只能使用显式模板特在命名空间内虽然我不能找到这个标准(但GCC说之多)。对我来说,以下工作(海合会):

struct CUtil { 
    template< typename at_Intermediate > static at_Intermediate convert_variant(const VARIANT &v) ; 
}; 

template<> VARIANT CUtil::convert_variant<VARIANT >(const VARIANT &v) { return v; } 
template<> double CUtil::convert_variant<double >(const VARIANT &v) { return v.dblVal; } 
template<> long CUtil::convert_variant<long >(const VARIANT &v) { return v.lVal ; } 
template<> BSTR CUtil::convert_variant<BSTR >(const VARIANT &v) { return v.bstrVal; } 

编辑是在标准

14.7.2.5:

类或函数的显式实例模板专门化被放置在定义模板的命名空间中。类模板的成员的显式实例化放置在定义了封闭类的名称空间中。 成员模板的显式实例放置在定义了封闭类或类模板的名称空间中。

在非POD模板参数的方向(由我添加的所有重点。)

2

试试这样说:

struct CUtil { 
    template< typename T > 
    static T convert_variant(const VARIANT &); 
}; 

template<> int CUtil::convert_variant<int>(const VARIANT &); 
template<> VARIANT CUtil::convert_variant<VARIANT>(const VARIANT &); 

不能明确专业类范围内的模板。 See here

VS2008的奇怪问题是,这确实有效。

struct CUtil { 
    template< typename T > 
    static T convert_variant(const VARIANT &); 
    template<> 
    static int convert_variant<int>(const VARIANT &); 
}; 

这:

struct CUtil { 
    template< typename T > static void convert_variant(T); 
    template<> static void convert_variant<VARIANT >(VARIANT); 
}; 
+0

点? – xtofl 2009-01-08 20:04:00

+0

尽管测试是一种POD类型。 – Eclipse 2009-01-08 20:05:30