希望在此澄清一下。下面的代码执行正常,但是当我取消注释else语句时,会发生编译错误。这是因为在main
我指定了int
类型的事件,尽管有string
类型的可能性。我已经将我的实际代码简化为下面的内容以缩小问题的范围,我该怎么做才能使data
中的向量main
可以是任何类型的getNextLineOfData返回?
#include <vector>
using namespace std;
template< typename T>
std::vector<T> getNextLineOfData(bool someBoolean)
{
std::vector<T> data;
if (someBoolean)
{
data.push_back(1);
data.push_back(2);
data.push_back(3);
}
/*
else
{
data.push_back("1");
data.push_back("2");
data.push_back("3");
}
*/
return data;
};
int main()
{
vector<int> data = getNextLineOfData<int>(true);
return 0;
}
答案 0 :(得分:-1)
您在代码片段中将编译时操作与运行时操作混淆。模拟函数getNextLineOfData
并使用getNextLineOfData<int>
实例化时,编译器会继续生成一个为您返回向量的函数。但是,if语句仅在运行时进行评估。因此,当编译器尝试构建代码时,它会发现您要根据条件将1
和"1"
添加到vector<int>
容器中。这是不允许的。
您可以使用模板专业化来解决您的问题。
#include <vector>
using namespace std;
template<typename T>
std::vector<T> getNextLineOfData() {
// default
}
template<>
std::vector<int> getNextLineOfData()
{
std::vector<int> data;
data.push_back(1);
data.push_back(2);
data.push_back(3);
return data;
};
template<>
std::vector<std::string> getNextLineOfData()
{
std::vector<std::string> data;
data.push_back("1");
data.push_back("2");
data.push_back("3");
return data;
};
int main()
{
vector<int> data = getNextLineOfData<int>();
return 0;
}
编辑:正如@BobTFish指出的那样,重载函数而不是模板专门化它可能会更好。上面的解决方案解决了您最初设置时的问题。
答案 1 :(得分:-1)
从评论中的额外信息中读取,我建议如下:
void getNextLine(std::vector<std::string>& output)
{
output.push_back("string data as you please");
}
void getNextLine(std::vector<int>& output)
{
output.push_back(1);
}
bool nextLineIsIntData()
{
// somehow determine if the coming data is strings or ints
return false;
}
int main()
{
std::vector<std::string> stringData;
std::vector<int> intData;
if (nextLineIsIntData())
getNextLine(intData);
else
getNextLine(stringData);
// do whatever you want
}
答案 2 :(得分:-1)
你正在做的事情完全是非法的。当你查看你说的if-else
语句时,如果某些条件为真,那么将执行此,但此将不会因此,编译器将忽略未执行的部分的原因太多了。这是错误的。您需要做的事情,在之前的答案中列出的是过载或专门针对不同数据类型的功能。
我还应该提一下,你尝试做的事情是糟糕的风格。您实际上依赖于用户也传递了正确的bool
值,这会影响您push_back()
到向量中的类型。为什么当您拥有模板模式匹配的强大功能时,可以完全消除依赖正确用户输入的需要。
在这种情况下,您遇到的任何类似情况都要让编译器决定