Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 模板化类的静态类函数是否可以在没有模板参数的情况下使用?_C++_Templates - Fatal编程技术网

C++ 模板化类的静态类函数是否可以在没有模板参数的情况下使用?

C++ 模板化类的静态类函数是否可以在没有模板参数的情况下使用?,c++,templates,C++,Templates,我有一个模板类,它包含一个不依赖于模板参数的静态函数。然而,编译器似乎强迫我在使用函数时指定一个类型名 template <typename T> class MyClass { ... static void function(); }; template <typename T> void MyClass<T>::function() { .... } 但是编译器不允许我。我意识到这是因为在头文件中,我明确地将函数标记为模板化,

我有一个模板类,它包含一个不依赖于模板参数的静态函数。然而,编译器似乎强迫我在使用函数时指定一个类型名

template <typename T>
class MyClass {
    ...
    static void function();
};

template <typename T>
void MyClass<T>::function() {
    ....
}
但是编译器不允许我。我意识到这是因为在头文件中,我明确地将函数标记为模板化,但当我从头文件中删除“”时,它也不会编译


正确的方法是什么?

不要将
模板
视为
。它只是一个构建类的框架

MyClass::function()
没有任何意义,因为除非专门化它,否则
MyClass
不是实际的类

MyClass::function()
MyClass::function()可能不依赖于模板参数,它们的行为可能相同,但它们不是相同的函数

template <typename T>
class MyClass {
    ...
    static void function();
};

template <typename T>
void MyClass<T>::function() {
    ....
}
让我们看看二进制文件:

    MyClass<int>::function();
00D617CE  call        MyClass<int>::function (0D611C2h) 
    MyClass<char>::function();
00D617D3  call        MyClass<char>::function (0D611C7h) 
MyClass::function();
00D617CE调用MyClass::函数(0D611C2h)
MyClass::function();
00D617D3调用MyClass::函数(0D611C7h)
为此,我为
函数
提供了一个空定义,因此它肯定不依赖于模板参数。正如您所看到的,这两个函数是不同的


这是因为编译器生成了两个类-
MyClass
MyClass

类型非常重要

模板可以专门化,因此:

template <typename T>
class MyClass {
public:
    static void function() { std::cout << "Hello, World!\n"; }
};


template <>
class MyClass<City> {
public:
    static void function() { launchRockets(); }
};
这是由
函数()调用的。
,它甚至更短,因为没有类

想象一下你有这样的经历:

template <typename T> struct Foo
{
    static void boom()
    {
        static int n = 0;
        std::cout << ++n << std::endl;
    }
};
模板结构Foo
{
静态空隙动臂()
{
静态int n=0;

如果模板实例化的类型不影响函数,我想知道它是否真的应该是一个成员函数(甚至是静态的)。也许它真的应该是同一命名空间中的一个外部函数?(不要误解:我并不是说当前的设计是错误的,只是我会三思而后行)“杰瑞-我想不出一个这样的设计不会错的情况。也许是外部的反应不是正确的反应,它可能是在一个基地,但显然使用模板系统,它不需要是坏的。你能想出任何理由为什么这是必要的?你绝对应该考虑使它成为非成员的功能。如果你不是。请看Scott Meyers的这篇文章,“@CrazyEddie:不,我想不出任何理由——我只是在不知道更多情况下,犹豫着直接谴责它。如果它与t无关,因此与MyClass无关,并且没有与t相关的参数,那么它似乎不应该是类的一员。也许一个独立函数更合适。最重要的是我经常想,
MyClass::function()
没有意义,因为
MyClass
不是一个实际的类。@LuchianGrigore:我同意,但是我选择了另一个角度,试图让OP理解为什么它是非理性的,而不仅仅是断言它。这是一个很好的论点。+1。但我认为类和模板类之间的混淆应该作为一个例子来解决我想把function()放在MyClass中的唯一原因是它在概念上与MyClass相关做了一些应该依赖于类型名的事情。@marcelnijman:这就是名称空间的作用:将相关的类和函数分组在一起。如果关系如此密切,则在同一个标题中声明它以明确说明。如果它只是相关的,则将两个标题放在同一文件夹中,并使它们都位于同一名称空间中。是否可能是否能够指定一个独立于类型名的函数定义,但它被添加到每个专门化中?我认为这最好地回答了我的问题。因此,基本上,我可以选择添加一个无意义的类型(并让代码的读者感到困惑)或者通过将函数放在全局函数的无上下文池中从类中删除该函数。或者是否有其他选项可以明确说明函数()在概念上属于MyClass?@marcelnijman:我认为公共名称空间是最干净的解决方案。
template <typename T>
class MyClass {
public:
    static void function() { std::cout << "Hello, World!\n"; }
};


template <>
class MyClass<City> {
public:
    static void function() { launchRockets(); }
};
void function() { std::cout << "Hello, World!\n"; }
template <typename T> struct Foo
{
    static void boom()
    {
        static int n = 0;
        std::cout << ++n << std::endl;
    }
};