相关疑难解决方法(0)

模板类成员专业化声明

当我在模板类中专门化(静态)成员函数/常量时,我​​对于声明的去向感到困惑.

以下是我该做什么的一个例子 - 直接从IBM关于模板专业化的参考中找到:

=== IBM会员专业化示例===

template<class T> class X {
public:
   static T v;
   static void f(T);
};

template<class T> T X<T>::v = 0;
template<class T> void X<T>::f(T arg) { v = arg; }

template<> char* X<char*>::v = "Hello";
template<> void X<float>::f(float arg) { v = arg * 2; }

int main() {
   X<char*> a, b;
   X<float> c;
   c.f(10); // X<float>::v now set to 20
}
Run Code Online (Sandbox Code Playgroud)

问题是,如何将其分为header/cpp文件?通用实现显然在标题中,但是专业化呢?

它不能进入​​头文件,因为它具体,导致多重定义.但如果它进入.cpp文件,是调用X :: f()知道专门化的代码,还是它可能依赖于泛型X :: f()?

到目前为止,我只在.cpp中获得了专门化,标题中没有声明.我在编译甚至运行我的代码时遇到了麻烦(在gcc上,暂不记住版本),并且它的行为符合预期 - 认识到专业化.但A)我不知道这是正确的,我想知道是什么,以及B)我Doxygen文档出来靠不住的和非常误导的(更详细的介绍了一下以后的问题). …

c++ templates declaration template-specialization

14
推荐指数
1
解决办法
1万
查看次数

模板成员函数专业化也可以是实例化吗?

我遇到了模板专业化的问题.以下构建和运行,但我不确定它应该:

// template.h
template <typename T>
class interface{
public:
   void doSomething();
};

// template.cpp
#include "template.h"
#include <iostream>
template <> void interface<int>::doSomething(){std::cout << "Did something\n";}

// main.cpp
#include "template.h"
int main(){
   interface<int> instance;
   instance.doSomething();
   return 0;
 };

g++ main.cpp template.cpp; ./a.out
Run Code Online (Sandbox Code Playgroud)

我的理解是所有编译单元都应该可以访问所有模板特化,而main.cpp则没有.如果我理解正确发生的事情,template.cpp中的特化也会实例化interface <int>,因此生成符号并且所有内容都很愉快地链接.但是,我很确定这属于不确定性的范畴,我不能指望它始终在任何地方工作.有人可以确认或否认我的怀疑吗?

谢谢!

c++ templates template-specialization

6
推荐指数
0
解决办法
191
查看次数