2014-07-24 82 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