MST

星途 面试题库

面试题:C++函数重载与类型匹配的模板及歧义处理

分析以下C++代码,解释代码中可能出现的函数重载歧义问题,并说明如何修改代码以避免歧义: ```cpp template<typename T> void func(T t) { std::cout << "Template version for general type" << std::endl; } template<> void func<int>(int t) { std::cout << "Specialized template version for int" << std::endl; } void func(double d) { std::cout << "Non - template version for double" << std::endl; } int main() { func(10); func(3.14); // 假设这里定义了一个自定义类型MyType,如何编写func函数的重载版本,使其能正确匹配MyType类型,且不会与现有重载产生歧义 // 在此处添加关于MyType及func函数重载的代码 return 0; } ```请完成代码中注释部分,并详细阐述避免歧义的原理。
44.2万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
  1. 函数重载歧义分析
    • 当调用 func(10); 时,不会有歧义。因为 10int 类型,编译器优先匹配专门化的模板函数 void func<int>(int t)
    • 当调用 func(3.14); 时,也不会有歧义。因为 3.14double 类型,编译器直接匹配非模板函数 void func(double d)
  2. 添加 MyTypefunc 函数重载
    #include <iostream>
    template<typename T>
    void func(T t) {
        std::cout << "Template version for general type" << std::endl;
    }
    template<> 
    void func<int>(int t) {
        std::cout << "Specialized template version for int" << std::endl;
    }
    void func(double d) {
        std::cout << "Non - template version for double" << std::endl;
    }
    class MyType {
    };
    void func(MyType myType) {
        std::cout << "Version for MyType" << std::endl;
    }
    int main() {
        func(10);
        func(3.14);
        MyType myObj;
        func(myObj);
        return 0;
    }
    
  3. 避免歧义的原理
    • 对于自定义类型 MyType ,编写一个独立的非模板函数 void func(MyType myType) 。这样,当调用 func 并传入 MyType 类型的对象时,编译器会优先匹配这个专门为 MyType 编写的非模板函数。这是因为在函数重载解析规则中,非模板函数通常比模板函数具有更高的优先级(除非模板函数是完全匹配的专门化版本)。所以,它不会与现有的模板函数和其他非模板函数产生歧义。