确定。这里代码:
#include <iostream>
using namespace std;
template<typename T>
struct A {
enum Status {
one = 1
};
template< Status status >
struct C;
};
template<typename T>
template<typename A<T>::Status status >
struct A<T>::C {
void operator()() {
cout << "C: " << (int)status << endl;
};
// void operator()();
};
// template<typename T>
// template<typename A<T>::Status status >
// void A<T>::C<status>::operator()() {
// cout << "C: " << status << endl;
//}
int main()
{
A<int>::C<A<int>::one> c;
c();
return 0;
}
它适用于clang和g ++ - 编译并运行。
但是,如果注释内联实现A :: C :: operator()(),并取消注释注释声明和out实现:
#include <iostream>
using namespace std;
template<typename T>
struct A {
enum Status {
one = 1
};
template< Status status >
struct C;
};
template<typename T>
template<typename A<T>::Status status >
struct A<T>::C {
// void operator()() {
// cout << "C: " << (int)status << endl;
// };
void operator()();
};
template<typename T>
template<typename A<T>::Status status >
void A<T>::C<status>::operator()() {
cout << "C: " << status << endl;
}
int main()
{
A<int>::C<A<int>::one> c;
c();
return 0;
}
clang没有做到这一点:
$ clang++ -std=c++11 main.cpp && ./a.out
main.cpp:28:23: error: nested name specifier 'A<T>::C<status>::' for declaration does not refer into a class, class template or class template partial specialization
void A<T>::C<status>::operator()() {
~~~~~~~~~~~~~~~~~^
1 error generated.
但是g ++确实有效:
$ g++-4.8 -std=c++11 -O2 -Wall -pedantic -pthread main.cpp
C: 1
我尝试在工作PC上使用Visual C ++ 2010编译代码,但两个示例都失败了。我现在无法验证它(没有Windows PC),我不确定 - 也许我犯了其他错误......
第二个样本中的错误以及适用于实现的语法是什么?
答案 0 :(得分:0)
在我看来,你只是忘记了struct C的实现中的模板参数。 以下固定代码在Visual C ++ 2010中编译文件:
#include <iostream>
#include <string>
#include <sstream>
#include <iostream>
using namespace std;
template<typename T>
struct A {
enum Status {
one = 1
};
template< Status status >
struct C;
};
template<typename T>
template<typename A<T>::Status status >
struct A<T>::C<status> {
/*void operator()() {
cout << "C: " << (int)status << endl;
};*/
void operator()();
};
template<typename T>
template<typename A<T>::Status status >
void A<T>::C<status>::operator()() {
cout << "C: " << status << endl;
}
int main()
{
A<int>::C<A<int>::one> c;
c();
return 0;
}