相关疑难解决方法(0)

C++中的模板特化和派生类

我有这个简单的代码:

class A{};
class B : public A{};
class C : public B{};

class Test
{
    public:
        template<typename T>
        void f(T&){printf("template\n");}
        void f(A&){printf("specialization\n");}
};

int main()
{
    A a;
    B b;
    C c;

    Test test;
    test.f(a);
    test.f(b);
    test.f(c);
}
Run Code Online (Sandbox Code Playgroud)

当我运行它(VS2010)时,我有这个输出:

specialization
template
template
Run Code Online (Sandbox Code Playgroud)

是否可以使用A-derived类进行调用以使用特化?

c++ templates

14
推荐指数
1
解决办法
5316
查看次数

C++模板函数重载决策

我有以下代码:

#include <iostream>

template <typename T>
void f (T) { std::cout << "f(T)" << std::endl; }

template <typename T>
void f (bool) { std::cout << "f(bool)" << std::endl; }

int main ( )
{
    f(true);        // #1 prints f(T)
    f<bool>(true);  // #2 prints f(bool)
}
Run Code Online (Sandbox Code Playgroud)

#1行称f(T),虽然#2行调用f(bool).

为什么会这样?选择重载模板函数的规则是什么?

UPDATE

我明白在第一次调用时,编译器T在尝试调用第二个函数时无法推断,因此选择第一个函数.

在第二个调用中,第二个函数被认为是更好的匹配gcc,而第一个函数是在VS2013下选择的.谁在这里做对了?顺便说一下,我仍然对这个过程的完整描述感兴趣.

c++ templates overloading overload-resolution

10
推荐指数
1
解决办法
5177
查看次数

标签 统计

c++ ×2

templates ×2

overload-resolution ×1

overloading ×1