使用VARIANT返回类型的模板实例化

时间:2009-01-08 19:38:34

标签: c++ templates

静态模板成员函数的显式实例化无法使用消息error C2785: 'at_Intermediate CUtil::convert_variant(const VARIANT &)' and '<Unknown>' have different return types

进行编译

当我使用非静态成员函数创建相应的类时,编译器喜欢我。

// 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. 为什么编译器在显然知道某个函数“Unknown”时会抱怨它?

  2. 触发此消息的原因 - 当函数全局或非静态时它会消失。

  3. 编辑:

    在Josh的一些有用提示之后:是否不允许在类声明中显式实例化模板函数?

2 个答案:

答案 0 :(得分: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);
};

答案 1 :(得分: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:

  

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

(我强调所有重点。)