Là một phần của một lớp đặc điểm cho một chương trình lớn hơn, tôi đã cố gắng tạo một biến lớp tĩnh có thể có một giá trị khác nhau tùy thuộc vào loại mà mẫu lớp kèm theo được khởi tạo.Lỗi trình biên dịch G ++ hoặc mã bị lỗi? : "định nghĩa mẫu không mẫu"
tôi đã đơn giản hóa các mã có liên quan để tạo ra một trần xương ví dụ về những gì tôi đang nói về:
#include <iostream>
#include <string>
#include <type_traits>
template <class T, class Enable = void>
struct Foo;
template <class T>
struct Foo<T,
typename std::enable_if<std::is_integral<T>::value>::type
>
{
static std::string message;
};
template <class T>
struct Foo<T,
typename std::enable_if<std::is_floating_point<T>::value>::type
>
{
static std::string message;
};
template <class T, class Enable>
std::string Foo<T, Enable>::message;
Với GCC 4.6, điều này mang lại một lỗi biên dịch: template definition of non-template ‘std::string Foo<T, Enable>::message
. Vấn đề xảy ra vì hai dòng cuối cùng, nơi tôi chỉ xác định biến tĩnh std::string Foo<T, Enable>::message
.
Tôi đang bối rối vì sao điều này xảy ra. Lỗi trình biên dịch biến mất nếu tôi bỏ qua hai dòng cuối cùng (nhưng tất nhiên là gây ra lỗi liên kết.) Đây có phải là lỗi trình biên dịch với GCC không?
+1 cho "ví dụ về xương trần". http://sscce.org/. –
Bạn cần phải bao gồm –
@Vaughn, đó không phải là vấn đề ở đây, nhưng tôi đã cập nhật đoạn mã. – Channel72