2014-07-24 80 views
0

我有有将基本类型的_variant_t静态函数的类类型:C++模板函数跳过一个静态函数调用

class VariantConverter { 
public: 
    static void ToVariant(int Value, _variant_t &Variant) { 
     Variant.vt = VT_I4; 
     Variant.intVal = Value; 
    } 

    static void ToVariant(double Value, _variant_t &Variant) { 
     Variant.vt = VT_R8; 
     Variant.dblVal = Value; 
    } 

    static void ToVariant(std::string Value, _variant_t &Variant) { 
     Variant.SetString(Value.c_str()); 
    } 

    static void ToVariant(bool Value, _variant_t &Variant) { 
     Variant.vt = VT_BOOL; 
     Variant.boolVal = Value; 
    } 
}; 

我想如下在我的模板函数的一个使用此:

void doSomething(_variant_t); 

template <typename T> 
void ProcessVariant(T Value) { 

    _variant_t Variant; 
    VariantConverter::ToVariant(Value, Variant);  // SKIPPED!!!! 

    doSomething(Variant);  // Do something with the _variant_t 
} 


int main() { 
    ProcessVariant<int>(1); 
    ProcessVariant<double>(1.1); 
} 


上面的代码是行不通的,所以我调试,找出什么是错的..

事实证明,ToVariant被调用的整个行被忽略了! (当我为每一行设置中断点并继续点击“继续”时,它只是忽略ToVariant线并直接转到doSomething)

为什么ToVariant方法根本不会被调用?

+0

@ T.C。对不起,这是一个错字。我更新了它。 – user2436815

+0

你怎么知道它没有被调用?什么指示(除了可能是片状的调试器)告诉你该功能被跳过? – PaulMcKenzie

+0

@PaulMcKenzie在Visual Studio中,我在ProcessVariant函数的每一行都设置了断点...它进入第一行,然后直接执行doSomething ..完全忽略第二行 – user2436815

回答

1

在MSVC13这个工作对我罚款:

struct _variant_t { 
    int intVal; 
    double dblVal; 
}; 

class VariantConverter { 
public: 
    static void ToVariant(int Value, _variant_t &Variant) { 
     //Variant.vt = VT_I4; 
     Variant.intVal = Value; 
    } 

    static void ToVariant(double Value, _variant_t &Variant) { 
     //Variant.vt = VT_R8; 
     Variant.dblVal = Value; 
    } 

    //static void ToVariant(std::string Value, _variant_t &Variant) { 
    // Variant.SetString(Value.c_str()); 
    //} 

    //static void ToVariant(bool Value, _variant_t &Variant) { 
    // Variant.vt = VT_BOOL; 
    // Variant.boolVal = Value; 
    //} 
}; 

void doSomething(_variant_t){} 

template <typename T> 
void ProcessVariant(T Value) { 

    _variant_t Variant; 
    VariantConverter::ToVariant(Value, Variant);  // NOT SKIPPED!!!! 

    doSomething(Variant);  // Do something with the _variant_t 
} 

int main(int argc, char *argv[]) 
{ 
    ProcessVariant<int>(1); 
    ProcessVariant<double>(1.1); 
} 

如果您使用的释放模式断点可真奇怪。优化器变得越来越聪明,如果doSomething在另一个编译单元中,它有时会发现您没有使用该参数,因此无法生成该参数。

+0

在调试模式下测试,它工作正常:)谢谢 – user2436815