gpt4 book ai didi

c++ - 模板、函数重载及其出现顺序

转载 作者:行者123 更新时间:2023-11-30 02:08:11 31 4
gpt4 key购买 nike

我试图为 this question 制作我的代码的简化版本.在这个过程中我遇到了一些对我来说没有意义的事情。有人可以解释为什么我得到以下结果吗?这是代码,它应该在 gcc 中编译和运行。

#include <string>
#include <iostream>
#include <typeinfo>

using std::string;

template <typename T> inline char getType(const T&) {return 'S'; }
inline char getType(const char&) {return 'C';}
template <typename T> inline char getType(T*) {return 'A'; }

template <typename T> inline void writeData(const T& x) {
printf("Calling default writeData...\n");
char type = getType(x);
if (type == 'S') {
printf("ERROR: binaryWrite::writeData -> Structure not defined.\n");
exit(1);
}
std::cout << x << std::endl;
}

template <typename T> inline void writeData(T* x, const unsigned int& len) {
printf("Writing array with writeData...\n");
char type = getType(x[0]);
std::cout << len << std::endl;
if (type == 'S') {
for (int i=0; i < len; ++i) {
writeData(x[i]);
}
} else {
for (int i=0; i < len; ++i) {
std::cout << x[i] << std::endl;
}
}
}

class binaryWrite {
public:
binaryWrite(void) {}
template <typename T>
void write(const T& x, const char* name) {
writeData(x);
}
};

inline void writeData(const string& s) {
unsigned int len = s.size();
const char* pt = s.c_str();
writeData(pt, len);
}

int main () {
string str = "Hello World";
writeData(str);
binaryWrite BF;
BF.write(str, "str");
return 0;
}

这是输出:

manuel-lopezs-macbook-pro:binaryFiles jmlopez$ g++ -o example example.cpp
manuel-lopezs-macbook-pro:binaryFiles jmlopez$ ./example
Writing array with writeData...
11
H
e
l
l
o

W
o
r
l
d
Calling default writeData...
ERROR: binaryWrite::writeData -> Structure not defined.

首先它调用writeData与字符串版本。在我尝试使用 binaryWrite 调用该版本之后函数 write (此函数调用 writeData )它调用模板定义的函数。

我试了一下,发现如果我将字符串的重载函数移到 binaryWrite 类定义的正上方然后我得到我想要的结果。

这是变化:

inline void writeData(const string& s) {
unsigned int len = s.size();
const char* pt = s.c_str();
writeData(pt, len);
}

class binaryWrite {
public:
binaryWrite(void) {}
template <typename T>
void write(const T& x, const char* name) {
writeData(x);
}
};

这是输出

Writing array with writeData...
11
H
e
l
l
o

W
o
r
l
d
Writing array with writeData...
11
H
e
l
l
o

W
o
r
l
d

看起来好像binaryWrite不知道重载函数writeData对于 string在第一种情况下。但是在切换之后,因为我首先定义了重载函数,所以它知道了。这是正确的解释吗?

我最终想做的是使用宏 WRITESTRUCT对于其他类型,但此定义将在其他一些文件中,因此我无法在 binaryWrite 的定义之前编写它们.如果我的解释确实是正确的,有什么想法可以解决这个问题吗?

最佳答案

好吧,玩弄你的代码,我发现如果你移动所有的 writeData 它也会正确执行binaryWrite 下方的模板和重载类定义。

当编译器遇到binaryWrite::write , 它会检查是否有 writeData 的定义在那时候。它正在选择 template <typename T> inline void writeData(const T& x)在这一点上,因为它只能访问前两个模板。然后它永远不会回头看看是否有更好的选择。

当您在 binaryWrite 之后移动 writeData 模板时,编译器没有 writeData 的定义,并决定在模板实例化期间再次查找。所以当你使用 binaryWrite::write 时,它选择直接重载,而不是模板。

关于c++ - 模板、函数重载及其出现顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7181153/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com