【发布时间】:2012-05-16 18:27:15
【问题描述】:
我有一个模板类,其中包含一个不依赖于模板参数的静态函数。然而,当我使用该函数时,编译器似乎强制我指定一个类型名。
template <typename T>
class MyClass {
...
static void function();
};
template <typename T>
void MyClass<T>::function() {
....
}
这个函数可以用作:
MyClass<int>::function();
但“int”只是为了满足编译器的需要。它没有任何意义,可以替换为任何其他类型,这不会增加代码的可读性。我想做一些类似的事情
MyClass<>::function();
甚至
MyClass::function();
但编译器不允许我这样做。我意识到这是因为在头文件中我已将函数明确标记为模板化,但是当我从头文件中删除“”时,它也无法编译。
这样做的正确方法是什么?
【问题讨论】:
-
如果模板被实例化的类型不影响函数,我想知道它是否真的应该是一个成员函数(甚至是静态的)。也许它真的应该是同一个命名空间中的外部函数? (不要误解:我并不是说当前的设计是错的,只是我会三思而后行)。
-
@Jerry - 我想不出这种设计不会出错的情况。也许在外部不是正确的反应,它可能在一个基础上,但显然在不需要它的地方使用模板系统是不好的。你能想出什么理由可以保证这样做吗?
-
您绝对应该考虑将其设为非成员函数。如果您不相信,请查看 Scott Meyers 的这篇文章,“How Non-Member Functions Improve Encapsulation”。
-
@CrazyEddie:不,我想不出理由——我只是犹豫要直接谴责它,而不知道发生了什么。
-
如果它与 T 无关,因此与 MyClass
无关,并且不接受与 T 相关的参数,那么它似乎不应该是类的成员。也许一个独立的功能更合适。