U 未命名类型 - 模板编译错误

问题描述

这是我的简单程序。我尝试强制使用 static_cast,以便编译器知道 U 只是 int。但是,模板仍然无法实例化我的函数 Add 的 int 版本。

将来,我想扩展此模板,以便 UV 属于不同类型,而我的程序仍然可以运行。

然而,目前,即使是相同的类型也不起作用。我在这里错过了什么?

编译错误的原因是什么?

#include <iostream>
using namespace std;

template <typename U>
class Addable
{
    U x;
public:
    Addable(U val) : x{ val } { cout << "Constructor called" << endl; }
    template <typename T>
    U add(T y);
};

U Addable::add(T y)
{
    x += y;
    return x;
}

int main()
{
    Addable<int> A{ 10 };
    int x = A.add(static_cast<int>(10));
    cout << x;
    return 0;
}

解决方法

您的模板成员函数定义错误。 定义模板类的模板成员函数时,需要指定两个模板参数如下:

template <typename U>
template <typename T>
U Addable<U>::add(T y)
{
    x += y;
    return x;
}

live demo

,

为了在模板类之外定义模板函数。正确的应该是

template <typename U> template <typename T>
U Addable<U>::add(T y)
{
   x += y;
   return x;
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...