Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.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,当我想定义在模板类中声明的方法,但该方法不依赖于模板参数时,我必须在include文件中将其定义为: template class<typename T> void MyClass::myMethod() { ... } ? 谢谢。把它放在头文件中 member函数仍然是类模板的成员,您必须编写: template <typename T> void MyClass<T>::myMethod() { /* ... */ } 模板无效MyClass::

当我想定义在模板类中声明的方法,但该方法不依赖于模板参数时,我必须在include文件中将其定义为:

template class<typename T>
void MyClass::myMethod()
{
   ...
}
?


谢谢。

把它放在头文件中

member函数仍然是类模板的成员,您必须编写:

template <typename T> void MyClass<T>::myMethod() { /* ... */ }
模板无效MyClass::myMethod(){/*…*/}
与所有模板成员函数一样,这实际上还不是一个真正的函数;它仅在实例化类模板时生成实际函数。因此,所有实例化模板的人都必须能够看到完整的模板定义,通常的做法是将所有内容都放在标题中


(请注意,类模板的成员函数本身被视为函数模板,您可以专门化它们:
template void MyClass::myMethod(){}

您需要这样做:

template class<typename T>
void MyClass<T>::myMethod()
{
   ...
}
模板类
void MyClass::myMethod()
{
...
}
模板化的不是方法,而是类


在非模板类中可以有一个模板方法,在模板类(您的案例)中可以有一个非模板方法,在模板类中可以有一个模板方法,当然在非模板类中可以有一个非模板方法。

您必须以其他方式定义它。方法本身可能不(直接)依赖于模板参数,但它所属的类确实依赖于模板参数,不是吗?因此,该方法也间接地依赖于模板参数:

template class<typename T>
void MyClass<T>::myMethod()
{  //       ^^^ -- note
   ...
}
模板类
void MyClass::myMethod()
{/^^^^--注
...
}

您需要这样定义您的方法:

template class<typename T>
void MyClass<T>::myMethod()
{
    // Method Body
}
模板类
void MyClass::myMethod()
{
//方法体
}

原因是该方法实际上依赖于模板参数。请记住,每个方法都可以访问特殊变量this;在方法调用期间,此实际上是传递给方法的参数
的类型根据对象实例化期间指定的模板参数而变化,因此,所有方法都必须是模板方法,以适应所有形式的

如果方法不依赖于模板参数,则只能使用继承AFAIK来实现

缺点:更多的代码+继承

优点:(大大)生成的代码更少,这取决于代码的哪些部分实际上依赖于模板。在下面的示例中,方法
NonDependentMethod
将只生成一个程序集,而
DependentMethod
将生成尽可能多的不同模板参数(在这种情况下,只生成一个,但生成一个
MyClass
,并且您有两个,以此类推)

#包括
使用名称空间std;
类MyClassBase
{
公众:
void NonDependentMethod();
};
模板类MyClass:公共MyClassBase
{
公众:
无效依赖方法(T参数);
};
void MyClassBase::NonDependentMethod()
{

你确定注释部分吗?听起来不对,例如,因为你可以创建类模板的部分专门化,但不能创建函数/方法模板。哦,哇,它实际上抱怨部分专门化的类型不完整。很高兴知道。为什么内在性列为缺点?你在哪段代码中看到我t是否定的?它不是否定的,但它确实有一点性能损失,因为需要在相关表中查找虚拟方法。此外,实例化派生类的每个实例需要设置所述查找表等。在您的示例中,虚拟方法在哪里?据我所知,虚拟模板方法仅是因此,在C++20中引入,即使您尝试过,也无法在2015年做到这一点。代码中也不需要使用命名空间std;
。您键入了21个字符以避免以后键入20,但随后根据标准库实现打开代码以防以后出现错误。您实际使用的是什么这里有问题吗?我认为即使是我最初的答案也充分解释了这两种方法的优点和缺点。对名称空间的挑剔与所问的问题无关。还有一个小问题是,在这种方法中,有时需要直接取消对名称空间的引用,以确保所包含的代码是依赖的,并避免使用pi检查其他隐藏的ID。
template class<typename T>
void MyClass<T>::myMethod()
{
    // Method Body
}
#include <iostream>
using namespace std;

class MyClassBase
{
public:
    void NonDependentMethod();
};

template <class T> class MyClass : public MyClassBase
{
public:
    void DependentMethod(T param);
};

void MyClassBase::NonDependentMethod()
{
    cout << "NonDependentMethod" << endl;
}

template<class T> void MyClass<T>::DependentMethod(T param)
{
    cout << "DependentMethod " << param << endl;
}

int main() {
    // your code goes here
    MyClass<int> cls;
    cls.NonDependentMethod();
    cls.DependentMethod(2);
    return 0;
}