Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/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++;-模板类中模板函数的单独声明/定义_C++_Oop_Templates_Methods_Implementation - Fatal编程技术网

C++ C++;-模板类中模板函数的单独声明/定义

C++ C++;-模板类中模板函数的单独声明/定义,c++,oop,templates,methods,implementation,C++,Oop,Templates,Methods,Implementation,我知道在头文件中声明模板类方法并在源文件中定义它的语法如下: myclass.h template <typename T> class MyClass { public: void method(T input); private: T privVar; }; 如何实现模板静态字符串ConvertFrom(_valtyval)?因为现在我不仅需要指定类模板,还需要指定函数模板。我打赌我将要编写的代码是无效的,但它应该显示我正在努力完成的任务: MyStri

我知道在头文件中声明模板类方法并在源文件中定义它的语法如下:

myclass.h

template <typename T>
class MyClass {
  public:
    void method(T input);
  private:
    T privVar;
};
如何实现
模板静态字符串ConvertFrom(_valtyval)?因为现在我不仅需要指定类模板,还需要指定函数模板。我打赌我将要编写的代码是无效的,但它应该显示我正在努力完成的任务:

MyString.cpp

template <class _Elem, class _Traits, class _Ax>
template <class _ValTy>
String<_Elem, _Traits, _Ax> String<_Elem, _Traits, _Ax>::ConvertFrom(_ValTy val) {
    // Convert value to String and return it...
}
模板
模板
字符串::ConvertFrom(_valtyval){
//将值转换为字符串并返回它。。。
}

我在模板方面一点都不先进。我不仅非常怀疑上述内容是否有效,而且写起来似乎很麻烦,可读性也不强。我将如何实现模板方法和返回自己类类型的静态模板方法?因为我不想在标题中定义它们。

在回答您的问题之前,让我先说:不要这样做。通过使用自由函数扩展std::string
,就像标准库实现许多算法一样。此外,我建议只针对范围而不是
string
s,但这更主观

还请注意,
std::string
避免隐式转换为C字符串,这不是为了让您的生活更困难,而是为了保护您的代码免受意外隐式转换可能导致的各种模糊错误的影响。我会花很长时间和精力去实施它们。试想一下:在编写代码时键入一次
.c_str()
需要花费一些额外的时间,在以后的时间里,任何阅读代码的人都会立即知道它被用作c样式字符串,而不是
std::string

要回答您的问题,只需将代码放在标题中:

//! Converts a value of the given type to a string.
template <class _ValTy> static String ConvertFrom(_ValTy val)
{
    // Code here
}
/!将给定类型的值转换为字符串。
模板静态字符串ConvertFrom(_valtyval)
{
//代码在这里
}

最后请注意,以下划线+大写字母开头的标识符(以及许多其他以
\uu
开头的标识符)是为编译器保留的,因此所有关于程序功能的赌注都是无效的。

您的函数定义是有效的,不能在类声明之外以不太详细的方式定义它。由于要将函数定义放在.cpp文件中,因此不能利用函数定义与更简洁的函数声明相结合的优势。通过将函数定义放在.cpp文件中,您还必须显式实例化模板类所需的所有专门化。

模板之外的模板成员函数定义语法如下:

template <class T> struct A
{
   template <class X> void f();
};

template<class T> template<class X> void A<T>::f()
{
}
模板结构A
{
模板void f();
};
模板模板无效A::f()
{
}
所以你的代码是正确的


请注意,在
.cpp
中定义模板成员不是很有用。在这种情况下,您应该显式地用需要与此模板一起使用的所有类型实例化它们。或者不要在这个
.cpp
之外使用它们,这是没有意义的。

您可能应该阅读:。@JesseGood,它告诉我有一种方法可以从源文件中的模板类单独实现一个普通方法,而不是如何从模板类实现模板化方法。也许我忽略了一些东西,我不想成为那个家伙。我是否应该放弃并继续在头文件中内联定义类方法?如果您只是尝试将原型与模板函数/类的功能分开,您可以尝试使用.inl范式:其中实际功能是.inl文件,您将该文件包含在头文件的末尾。@BrandonMiller:当您说头文件中的
inline
时,是指类内部吗?情况并非如此,您可以在头文件或单独的实现文件中定义类之外的模板成员,但不能在源文件中定义(除非您显式实例化它们)。
//! Converts a value of the given type to a string.
template <class _ValTy> static String ConvertFrom(_ValTy val)
{
    // Code here
}
template <class T> struct A
{
   template <class X> void f();
};

template<class T> template<class X> void A<T>::f()
{
}