- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
如果我有一些琐碎的事情,例如(澄清一下,我并不是说这是一个很好的实现,只是一个演示成员函数部分模板特化失败的例子):
template <typename T, typename U>
class BankAccount
{
T money;
U interestRate;
public:
BankAccount(T money, U interestRate) :
money(money), interestRate(interestRate)
{}
void showMeTheMoney();
};
我不能能够通过以下方式专门化每个功能:
// invalid code
template <typename U>
void BankAccount <int, U>::showMeTheMoney()
{
printf("$%d.00 interest: %f\n", money, interestRate);
}
template <typename U>
void BankAccount <long, U>::showMeTheMoney()
{
printf("$%l.00 interest: %f\n", money, interestRate);
}
template <typename U>
void BankAccount <float, U>::showMeTheMoney()
{
printf("$%.2f interest: %f\n", money, interestRate);
}
template <typename U>
void BankAccount <double, U>::showMeTheMoney()
{
printf("$%.2f interest: %f\n", money, interestRate);
}
int main(int argc, char *argv[])
{
BankAccount<double, float> b(500, 0.03);
b.showMeTheMoney();
BankAccount<std::uint64_t, float> c(1234, 0.01);
c.showMeTheMoney();
}
等不幸的是,C++ 标准不允许这样做:
14.5.5.3.1. The template parameter list of a member of a class template partial specialization shall match the template parameter list of the class template partial specialization. The template argument list of a member of a class template partial specialization shall match the template argument list of the class template partial specialization.
因此,唯一的解决方案(据我所知)是使用类型特征或使用样板代码重现整个类。这个决定背后是否有理由,或者这是 C++ 中根本不存在的东西,因为没有足够的需求,还是其他一些原因?
最佳答案
因为它不是您编写的成员函数的模板特化。它是类(class)的特化。因此,代码应该如下所示(我添加了一个公共(public)基类,您不必为所有规范定义成员):
template <typename T, typename U>
class BankAccountBase
{
protected:
T money;
U interestRate;
public:
BankAccountBase(T money, U interestRate) :
money(money), interestRate(interestRate)
{}
};
template <typename T, typename U>
class BankAccount
{
T money;
U interestRate;
public:
BankAccount(T money, U interestRate) :
money(money), interestRate(interestRate)
{}
void showMeTheMoney();
};
template <typename U>
class BankAccount <int, U> : public BankAccountBase <int, U>
{
public:
BankAccount(int money, U interestRate) :BankAccountBase(money, interestRate) { }
void showMeTheMoney();
};
template <typename U>
class BankAccount <long, U> : public BankAccountBase <long, U>
{
public:
BankAccount(long money, U interestRate) :BankAccountBase(money, interestRate) { }
void showMeTheMoney();
};
template <typename U>
class BankAccount <float, U> : public BankAccountBase <float, U>
{
BankAccount(float money, U interestRate) :BankAccountBase(money, interestRate) { }
public:
void showMeTheMoney();
};
template <typename U>
class BankAccount <double, U> : public BankAccountBase <double, U>
{
public:
BankAccount(double money, U interestRate) :BankAccountBase(money, interestRate) { }
void showMeTheMoney();
};
template <typename U>
class BankAccount <long long, U> : public BankAccountBase <long long, U>
{
public:
BankAccount(long long money, U interestRate) :BankAccountBase(money, interestRate) { }
void showMeTheMoney();
};
// invalid code
template <typename U>
void BankAccount <int, U>::showMeTheMoney()
{
printf("$%d.00 interest: %f\n", money, interestRate);
}
template <typename U>
void BankAccount <long, U>::showMeTheMoney()
{
printf("$%l.00 interest: %f\n", money, interestRate);
}
template <typename U>
void BankAccount <long long, U>::showMeTheMoney()
{
printf("$%l.00 interest: %f\n", money, interestRate);
}
template <typename U>
void BankAccount <float, U>::showMeTheMoney()
{
printf("$%.2f interest: %f\n", money, interestRate);
}
template <typename U>
void BankAccount <double, U>::showMeTheMoney()
{
printf("$%.2f interest: %f\n", money, interestRate);
}
int main(int argc, char *argv[])
{
BankAccount<double, float> b(500, 0.03);
b.showMeTheMoney();
BankAccount<long long, float> c(1234, 0.01);
c.showMeTheMoney();
}
关于c++ - 为什么不允许成员函数的模板特化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53855546/
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 4 年前。
正如您在 this travis.yml 中看到的那样文件,我的代码依赖于一些第三方库,我在构建项目之前将它们安装在远程系统上。 Travis 每次推送提交时都会下载并构建这些库,这可以避免吗?我的意
我是一名优秀的程序员,十分优秀!