gpt4 book ai didi

c++ - 显式特化已经被实例化

转载 作者:太空狗 更新时间:2023-10-29 20:49:51 25 4
gpt4 key购买 nike

我想将模板函数的特化实现放到一个单独的源文件中,但是如果我尝试调用它(在 MyAction 中),我会得到这个错误:

Explicit specialization has already been instantiated

我不知道为什么会出现此错误。示例代码:

main.cpp

#include <iostream>
#include <string>

#include "MyClass.h"

int main()
{
std::cout << "Hello, " << XX::MyClass().MyMethod<1>() << std::endl;
std::cin.get();
}

MyClass.h

#pragma once

#include <string>

namespace XX {

struct MyClass {

std::string MyAction() {
return MyMethod<0>() + MyMethod<1>();
}

template<int>
std::string MyMethod();

};

template<>
std::string MyClass::MyMethod<0>();

template<>
std::string MyClass::MyMethod<1>();

}

MyClass.cpp

#include "MyClass.h"

namespace XX {

template<>
std::string MyClass::MyMethod<0>() {
return "FOO";
}

template<>
std::string MyClass::MyMethod<1>() {
return "BAR";
}

}

是否有我不知道的模板实例化规则?

最佳答案

好的,看来问题出在订单上。

当您定义 MyAction 时编译器尝试实例化模板,但他不知道专门化。

当你声明MyAction并在模板特化后在 cpp 中定义它,它将起作用。

// header part
#include <string>

namespace XX {
struct MyClass {
template<int>
std::string MyMethod();
std::string MyAction();
};
}

// cpp part
namespace XX {
template<>
std::string MyClass::MyMethod<0>() {
return "a";
}

template<>
std::string MyClass::MyMethod<1>() {
return "b";
}

std::string MyClass::MyAction() {
return MyMethod<0>() + MyMethod<1>();
}
}

参见此处:https://godbolt.org/z/aGSB21

如果你移动请注意MyClass::MyAction()以上MyClass::MyMethod<1>()错误会回来。

这是可以在头文件中声明特化的版本:https://godbolt.org/z/kHjlne

关于c++ - 显式特化已经被实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57220582/

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