以下示例编译并显示正确的endresult。编辑:在打印三行的意义上。
#include <iostream>
using namespace std;
struct normal
{
static void log(const char * out) { cout << out << endl; }
};
struct other
{
static void log(const char * out) { cout << out << endl; }
};
//Implementation inside the class declaration
template<typename output = normal>
class LogUser_H
{
public:
void print() { output::log("template"); }
};
//Move Implementation moved out of the class declaration
template<typename output = normal>
class LogUser_CPP
{
public:
void print();
};
//Specialised definitions
void LogUser_CPP<struct normal>::print(void) { normal::log("normal specialisation"); }
void LogUser_CPP<struct other>::print(void) { other::log("other specialisation"); }
//Template definition ?
//void LogUser_CPP</*??*/output/*??*/>::print(void)
//{
// output::log("template");
//}
int main()
{
LogUser_H<> H;
H.print();
LogUser_CPP<> C1;
C1.print();
LogUser_CPP<other> C2;
C2.print();
}
类LogUser_H
有一个方法可以调用struct中的函数。 LogUser_CPP
意味着我要将方法定义从类定义中移出并在下面写下来。这样做我不再有output
的定义,我无法获得满足输出要求的结构中的函数。但是我可以提供结构的专用版本并以这种方式编译。
如何删除两个专门的实施void LogUser_CPP<struct normal>::print(void)
和void LogUser_CPP<struct other>::print(void)
?想要用通用实现替换它们,看起来像注释掉的实现void LogUser_CPP</*??*/output/*??*/>::print(void)
。
编辑1: 我尝试了以下方法:
//Specialised definitions
//void LogUser_CPP<struct normal>::print(void) { normal::log("normal specialisation"); }
//void LogUser_CPP<struct other>::print(void) { other::log("other specialisation"); }
template<>
void LogUser_CPP<>::print(void)
{
output::log("template");
}
这不会编译。
编辑2: 我尝试了以下方法:
//Specialised definitions
//void LogUser_CPP<struct normal>::print(void) { normal::log("normal specialisation"); }
//void LogUser_CPP<struct other>::print(void) { other::log("other specialisation"); }
template<typename output>
void LogUser_CPP<>::print(void)
{
output::log("template");
}
这不会编译。
错误是error C3211: 'LogUser_CPP<normal>::print' : explicit specialization is using partial specialization syntax, use template <> instead
这可能是编译器特定的吗?这台电脑上有VS2013 Express。
答案 0 :(得分:1)
使用:
template <>
void LogUser_CPP<normal>::print(void) { normal::log("normal specialisation"); }
template <>
void LogUser_CPP<other>::print(void) { other::log("other specialisation"); }
或
template<typename output>
void LogUser_CPP<output>::print(void)
{
output::log("template");
}