c++ - 从内部类调用模板函数

标签 c++ c++14

我有一个像这样的类来根据类型调用函数。我尝试编译它,但出现错误 error C2059 syntax error : 'template'

class A
{
  call_1()
{
  B<type> b;
  b.template say(i);
}

template<class T>
    struct B
    {
        template <typename T, typename I>
        T say(I i) {
            return word;
        }
    };
    template<>
    struct B<void>
    {
        template <typename T, typename I>
        void say(I i) {
            /**/
        }
    };
}

我做错了什么?

最佳答案

首先,让我们将您的示例重写为可读且更接近可编译的内容,我们还在 say() 中打印“1”或“2”以了解调用了哪个函数:

#include <iostream>
using type = int;

class A {
    void call_1() {
        B<type> b;
        int i = 0;
        b.template say(i);
    }

    template<class T>
    struct B
    {
        template <typename T, typename I>
        T say(I i) {
            std::cout << "1\n";
            return T();
        }
    };

    template<>
    struct B<void>
    {
        template <typename T, typename I>
        void say(I i) {
            std::cout << "2\n";
        }
    };
};

好的,那么首先,您要尝试在 A 内部特化 B。这是不允许的,所以不要将它移到 A 之外:

using type = int;

class A {
    void call_1() {
        B<type> b;
        int i = 0;
        b.template say(i);
    }

    template<class T>
    struct B
    {
        template <typename T, typename I>
        T say(I i) {
            std::cout << "1\n";
            return T();
        }
    };
};

template<>
struct A::B<void>
{
    template <typename T, typename I>
    void say(I i) {
        std::cout << "2\n";
    }
};

接下来,您将在 Bsay() 中使用相同的模板参数 (T)。您不需要重复 T,所以让我们删除它:

using type = int;

class A {
    void call_1() {
        B<type> b;
        int i = 0;
        b.template say(i);
    }

    template<class T>
    struct B
    {
        template <typename I>
        T say(I i) {
            std::cout << "1\n";
            return T();
        }
    };
};

template<>
struct A::B<void>
{
    template <typename I>
    void say(I i) {
        std::cout << "2\n";
    }
};

最后,call_1()不能在A::B特化前定义,所以我们也需要把它移到外面:

using type = int;

class A {
    void call_1();

    template<class T>
    struct B
    {
        template <typename I>
        T say(I i) {
            std::cout << "1\n";
            return T();
        }
    };
};

template<>
struct A::B<void>
{
    template <typename I>
    void say(I i) {
        std::cout << "2\n";
    }
};

void A::call_1() {
    B<type> b;
    int i = 0;
    b.template say(i);
}

现在应该可以编译并执行您想要的操作。调用 call_1() 将打印 1。如果将 typeint 更改为 void:

using type = void;

它将打印2

关于c++ - 从内部类调用模板函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47487676/

相关文章:

c++ - auto、decltype(auto) 和尾随返回类型

templates - 如何使用 std::enable_if_t 和 std::is_base_of 来检查 SFINAE 的编译时继承?

c++ - 什么是 lambda 函数类型? C++

c++ - 为什么在传递给另一个对象时调用 const 对象上的 std::move 会调用复制构造函数?

c++ - 正确转换为指向返回函数的函数的函数指针

c++ - 如何为包含另一个类实例的数组创建 const getter?

c++ - 当 extern 声明和定义之间存在不匹配的类型时会出现什么行为?

C++ 日志播放和蓝屏 0x0000008E (hooks)

c++ - 测试 std::is_integral 和 std::is_signed?

c++ - sizeof() std::vector (C++)